【问题标题】:EF Code first related entities context failEF Code first 相关实体上下文失败
【发布时间】:2011-08-02 08:12:00
【问题描述】:

不知道如何正确命名。我在 m:n 关系中有两个实体:成员和角色。

public class Role
{
    public int Id { get; set; }
    public string Title { get; set; }

    public ICollection<Member> MembersInRole { get; set; }
}

public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

    public ICollection<Role> Roles { get; set; }
}

我做了一些种子数据:
http://i56.tinypic.com/2vjvj1w.png

并写了测试:

问题是,我的成员实体没有分配角色,即使我在上下文中创建它们(如您在图像中看到的那样)。我不知道怎么了。数据库中的表似乎没问题。我不确定上下文实例是否有问题。不过应该没问题,因为我一直在处理种子数据。

【问题讨论】:

    标签: entity-framework many-to-many entity-relationship ef-code-first entity-framework-4.1


    【解决方案1】:

    尝试通过显式包含角色来预先加载角色:

    Member admin = db.Members.Include("Roles").FirstOrDefault(m => m.Name == "Admin");
    

    【讨论】:

      【解决方案2】:

      您的 MembersRoleRoles 导航属性不是虚拟的,因此 EF 无法为延迟加载创建代理。因此,您必须明确要求 EF 加载您的导航属性。将您的属性标记为虚拟:

      public class Role
      {
          public int Id { get; set; }
          public string Title { get; set; }
      
          public virtual ICollection<Member> MembersInRole { get; set; }
      }
      
      public class Member
      {
          public int Id { get; set; }
          public string Name { get; set; }
          public string Password { get; set; }
          public string Email { get; set; }
      
          public virtual ICollection<Role> Roles { get; set; }
      }
      

      或者使用@Yakimych 方法。 EF 4.1 中的预加载也可以使用 lambdas 定义:

      Member admin = db.Members.Include(m => m.Roles)
                               .FirstOrDefault(m => m.Name == "Admin");
      

      【讨论】:

      • +1 感谢您的进一步解释。我很愚蠢,实际上忘记了这一点。
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多