MVC4 Linq数据库调用

时间:2013-07-15 05:35:31

标签: asp.net-mvc linq entity-framework

使用我的第一个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);
    }

1 个答案:

答案 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();