我构建了一个查询,通过用户名查找用户。当我运行程序时,我得到:
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");
}
答案 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();
另外,请确保您连接到测试数据库,而不是其他记录重复的数据库。