0

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

InvalidOperationException:序列包含多个元素

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

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

使用下面的提示我尝试调试,发现方法变成了一个空字符串。因此,在这种情况下,我收到多个响应是正常的,因为 ProgramUserName 仅在几行中不为空,因为它适用于使用 Active Directory 帐户登录的用户。

但是为什么我会得到这个空字符串?会不会 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");
}
4

2 回答 2

1

仅当有多个记录时才会发生此异常。尝试在 Sql Server 管理工作室或您拥有的任何东西中运行查询,或尝试调试代码并查看 userName 的值是什么。例如

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>();
}
于 2013-06-20T11:56:18.740 回答
1

该错误非常明确。尝试更改SingleOrDefault为 aWhere并添加ToList到末尾,然后在下一行放置一个断点,以便您可以看到返回的实际行。

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

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

于 2013-06-20T11:58:56.803 回答