Sequence包含多个元素异常,但在数据库中只有一个

时间:2013-06-20 11:45:42

标签: c# database asp.net-mvc-4 linq-to-sql invalidoperationexception

我构建了一个查询,通过用户名查找用户。当我运行程序时,我得到:

  

InvalidOperationException:Sequence包含多个元素

我检查了测试数据库,只有4个用户,没有双重名称。异常从哪里来?这是查询:

public void setUser(String userName)
{
    AzaraUser = DatabaseConnection.DataContext.GetTable<AzaraUser>()
                .SingleOrDefault(a => a.ProgramUserName == userName || a.UserName == userName);
}

通过以下提示我尝试调试,发现该方法变为空字符串。所以在这种情况下,我得到几个响应是正常的,因为ProgramUserName只有几行而不是null,因为它是用于使用活动目录帐户登录的用户。

但为什么我会得到这个空字符串?可能是那一刻WebSecurity也是空的吗?在什么时候它会获得有关当前用户的信息?

这是我的登录方法:

[HttpPost]
public ActionResult Login(FormCollection logInForm)
{  
    // try the default membership auth 
    if (Membership.ValidateUser(logInForm["name"], logInForm["password"]))
    {
        FormsAuthentication.SetAuthCookie(logInForm["name"], false);
        user.setUser(WebSecurity.CurrentUserName);
        string returnUrl = Request.QueryString["ReturnUrl"];

        if (returnUrl == null)
        {
            Response.Redirect("~/home/index");
        }
        else
        {
            Response.Redirect(returnUrl);
        }
    }
    else
    {
        ModelState.AddModelError("", "Login failed");
    } 

    // try to auth user via AD
    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
    {
        if (pc.ValidateCredentials(logInForm["name"], logInForm["password"]))
        {
            FormsAuthentication.SetAuthCookie(logInForm["name"], false);
            user.setUser(WebSecurity.CurrentUserName);
            return RedirectToAction("Index", "Home");
        }
    }

    return View("LogOn");
}

2 个答案:

答案 0 :(得分:1)

仅当有多个记录时才会发生此异常。 尝试在Sql Server管理工作室或您拥有的任何内容中运行查询,或尝试调试代码并查看userName的值。 e.g

SELECT * FROM AzaraUser WHERE ProgramUserName = 'ABC' OR UserName  = 'ABC'

或尝试:

public List<AzaraUser> setUser(String userName)
{
 AzaraUser = DatabaseConnection.DataContext.GetTable<AzaraUser>().WHERE(a => a.ProgramUserName == userName || a.UserName == userName).ToList<AzaraUser>();
}

答案 1 :(得分:1)

错误很明确。尝试将SingleOrDefault更改为Where并将ToList添加到最后,然后在下一行放置一个断点,以便查看返回的实际行。

AzaraUser = DatabaseConnection.DataContext.GetTable<AzaraUser>()
            .Where(a => a.ProgramUserName == userName || a.UserName == userName)
            .ToList();

另外,请确保您连接到测试数据库,而不是其他记录重复的数据库。