0

在我的第一个MVC应用程序上工作。我正在使用 MVC4 附带的简单成员数据库来管理用户和角色。我的理解是,我必须执行以下三个步骤才能使Find()下面的调用起作用:获取GUID登录人员的简单成员身份,使用简单成员身份GUID获取我的 Couriers 数据库中的 ID,然后使用该 ID 作为缺少的参数下面的Find()调用返回模型/记录以在视图中编辑?

如何/我使用什么作为 .Find() 调用的参数?我是在正确的轨道上,还是让这变得更加复杂?

ps - 创建 Courier 记录时,我GUID将 Couriers 数据库中的成员资格保存在与 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);
    }
4

1 回答 1

0

MSDN 文档说:

使用主键值尝试查找上下文跟踪的实体。如果实体不在上下文中,则将执行查询并针对数据源中的数据进行评估,如果在上下文或数据源中找不到实体,则返回 null。

因此,如果您将 userId 作为 Couriers 表中的主键,那么您可以像这样使用.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();
于 2013-07-15T05:38:53.443 回答