我尝试在FirstOrDefault
的帮助下使用实体框架从我的表中获取数据。
控制器代码如下:
public ActionResult getUser(MembershipModel model)
{
ProviderImplementation.Edmx.ProviderEntities providerEntities = new ProviderImplementation.Edmx.ProviderEntities();
//var membershipModel = new MembershipModel();
//var model = ProviderImplementation.Models.MembershipModel;
//bool isUserOnline = true;
if (!ModelState.IsValid)
{
var isValid = Membership.GetUser(model.UserName, true);
if (isValid != null)
{
var rowData = providerEntities.Users.Where(u => u.UserName.Equals(model.UserName)).FirstOrDefault();
model.UserName = rowData.UserName;
model.Password = rowData.Password;
model.UserId = Convert.ToInt32(rowData.UserId);
model.RoleId = Convert.ToInt32(rowData.RoleId);
//var singleValue = providerEntities.Users.Find(model.UserName);
ViewBag.User = "Found";
}
else
{
ViewBag.User = "Not Found";
}
}
else
{
var error = ModelState.Values.SelectMany(v => v.Errors);
ModelState.AddModelError("NoModelError", error.ToString());
}
return View(model);
}
我的表格数据如下: 表名:用户
现在我尝试了很多东西,它打印好了视图中的数据并选择了特定的记录。
问题出在这里:
{工作正常} - > 1.当我使用用户名“abbas”获取记录时,首先遇到UserId = 2,它会在视图中打印得很好
查看代码是:
<div style="margin-left: 200px;">
<table cellpadding="10" cellspacing="10">
<tr>
<th>Get User Details</th>
</tr>
<tr>
<th>@ViewBag.User</th>
</tr>
<tr>
<td>@Html.LabelFor(m => m.UserId)</td>
<td>@Html.LabelFor(m => m.UserName)</td>
<td>@Html.LabelFor(m => m.Password)</td>
<td>@Html.LabelFor(m => m.RoleId)</td>
</tr>
<tr>
<td>@Html.DisplayFor(Model=>Model.UserId)</td>
<td>@Html.DisplayFor(Model=>Model.UserName)</td>
<td>@Html.DisplayFor(Model=>Model.Password)</td>
<td>@Html.DisplayFor(Model=>Model.RoleId)</td>
</tr>
</table>
</div>
{问题} - GT; 2.当我使用UserId = 4的用户名“Abbas”获取记录时,FirstOrDefault会首先打印上面遇到的UserName =“abbas”的上述数据,并且不会在View中打印UserName =“Abbas”。
注意:
SingleOrDefault返回一个异常,告知它找到了多个实例。
更新:在我更改值时进行调试时,它会从数据库中完美打印。
答案 0 :(得分:0)
EF背后的SQL查询并没有区分&#34; abbas&#34; /&#34;阿巴斯&#34;。请运行SQL事件探查器并查看在呼叫上执行的查询。
答案 1 :(得分:0)
首先,您应该放弃使用重复的用户名条目的想法。这应该可以解决您所面临的非常基本的问题,并且是拥有用户帐户数据的最佳做法。
如果您坚持认为用户名可能重复,请使用区分大小写的搜索执行FirstOrDefault
。你可以试试代码片段吗?
var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName.Equals(model.UserName));
答案 2 :(得分:0)
我同意之前的答案,你不应该有一个基于区分大小写区分用户名的系统。这表明您的结构设计不佳,因此我建议您更改系统。我可以看到例如你在与用户表相同的表中有roleid,如果你在这个表上生成多个登录,具有不同的区分大小写作为处理同一个人的不同角色的方法,有更好的方法来处理从长远来看,这将使你更少悲伤。
但是,如果您想检查区分大小写,请尝试:
var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName == model.UserName && String.Compare(u.UserName, model.UserName,false) == 0);
您还可以尝试以下(数据库查询):
var rowData = db.Users.ToList().Where(x => (string.Compare(x.UserName, model.UserName, false) == 0)).FirstOrDefault();
这假定您的用户类是&#39;用户&#39;。