EF Code第一个相关实体上下文失败

时间:2011-04-10 02:57:27

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

Dunno如何恰当地命名。我在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

并写了测试:
http://i54.tinypic.com/112916b.png

问题是,我的会员实体没有分配角色,即使我在上下文中创建它们(如图所示)。我不知道出了什么问题。数据库中的表似乎没问题。我不确定上下文实例是否有问题。但它应该没问题,因为我一直在处理种子数据。

2 个答案:

答案 0 :(得分:9)

您的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 :(得分:2)

尝试通过明确地包含角色来急切加载角色:

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