2013-12-15 145 views
2

我有一个在POST和PUT都被调用的方法。该方法更新当前用户的用户名。查询看起来像:LINQ查询没有返回正确的结果

public override void Save() 
{ 
    if (SessionManager.CurrentSession.Query<User>() 
            .Any(u => u.Username == this.Username)) 
     throw new DuplicateNameException("Username already exists"); 
    ... 

也能正常工作的POST每次我尝试创建一个新用户存在一个数据库中的用户名时,它抛出DuplicateNameException。然而,在PUT上,当我尝试将现有的用户名更改为已存在的用户名时,此异常从未受到影响。我不知道为什么查询将不同于POST和PUT。有什么想法吗?提前致谢。

+2

等待,如果您不更改用户名,但用户已经存在,那么'Any'条件将返回'true',因为同一用户的记录与过滤器匹配? –

+0

@JeanHominal为了确保我的理解正确,如果当前用户名是[email protected],那么如果我不更改用户名,并且尝试PUT并发送[email protected],那么执行如果陈述是真实的?是的,是这样。现在这不是最好的用户体验,他们应该在用户使用当前用户名时弹出取消消息,而不是使用他们已有的用户名发送消息。 – Crystal

回答

2

奇数。你已经确认你期望执行的代码实际上正在执行?如在,PUT调用不会导致这被跳过或其他方法被调用呢?而PUT调用实际上是击中服务器?当进行PUT调用时,实际上正确填充了“用户名”?当进行PUT调用时,“CurrentSession”属性和“Query”调用实际上绑定了它们应该返回的数据并返回数据(例如,它可能返回一个空列表,因为某些连接或其他设置尚未设置在这种情况下)?

+0

是的,我实际上已经检查过,当PUT被调用时它得到了这个方法,但是它跳过了我完全困惑的if条件语句。用户名是我所期望的,就像原来的名字是[email protected],并且我将其更改为[email protected](假设[email protected]已经存在),if语句返回false。我需要像你提到的那样检查CurrentSession属性和Query。这些ORM中的一些东西对我来说很新。 – Crystal

0

您是否从表单中获取用户名?我认为用户名不能正确传递给PUT。

+0

PUT不是来自表单。我们使用主干,在保存时,PUT被调用。我基本上从输入字段中使用jQuery获取元素,填充我的主干对象,然后调用save()。 – Crystal