使用我的第一个MVC
应用。我使用MVC4附带的简单成员资格数据库来管理用户和角色。我的理解是,我必须执行以下Find()
调用的三个步骤:获取登录人员的简单成员资格GUID
,使用简单成员资格GUID
获取我的Couriers数据库中的ID,然后使用该ID作为下面Find()
调用中的缺失参数,以返回要在视图中编辑的模型/记录?
我如何/如何使用.Find()调用作为参数?我是在正确的轨道上,还是让这更复杂?
ps - 在创建Courier记录时,我将Couriers数据库中的成员资格GUID
保存在与Courier ID主键列不同的列中。谢谢。
public ActionResult EditCourier()
{
System.Web.Security.MembershipUser user = Membership.GetUser();
var providerUserKey = user.ProviderUserKey;
Guid userId = (Guid)providerUserKey;
String userIDstring = userId.ToString();
var model =
from c in db.Couriers
where c.CourierMembershipID == userIDstring
select c.ID;
Courier courier = db.Couriers.Find();
if (courier == null)
{
return HttpNotFound();
}
return View(courier);
}
答案 0 :(得分:0)
MSDN文档说:
使用主键值尝试查找由...跟踪的实体 上下文。如果实体不在上下文中,则查询将是 根据数据源中的数据执行和评估,并为null 如果在上下文或数据中找不到实体,则返回 源。
因此,如果您在Couriers表中将userId作为主键,那么您可以像这样使用.Find():
Courier courier = db.Couriers.Find(userId);
否则您应该使用标准LINQ查询,然后调用.FirstOrDefault()
或SingleOrDefault()
方法:
Courier courier = db.Couriers.FirstOrDefault(c=>c.CourierMembershipID == userIDstring);
编辑:
我想您从下一个查询中收到此错误:
var model =
from c in db.Couriers
where c.CourierMembershipID == userIDstring
select c.ID;
原因是您从此查询IEnumerable<Courier>
模型中获取。
要使此查询获取单个Courier
对象,请尝试在结尾处调用.FirstOrDefault()
:
var model = (from c in db.Couriers
where c.CourierMembershipID == userIDstring
select c.ID).FirstOrDefault();