EF代码第一个相关的实体上下文失败

问题描述:

不知道如何正确命名。我有m:n关系中的两个实体:成员和角色。EF代码第一个相关的实体上下文失败

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

的问题是,我的会员单位没有分配角色,甚至当我在上下文中创建它们时(如您在图像中看到的那样)。我不知道什么是错的。数据库中的表似乎没问题。我不确定上下文实例是否有问题。但它应该没问题,因为我一直在处理种子数据。通过将其明确包含

尝试渴望加载的角色:

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

谢谢,这是一个可行的解决方案。 – Damb 2011-04-10 10:40:47

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"); 
+0

+1感谢您的进一步解释。我很愚蠢,实际上忘记了这一点。 – Damb 2011-04-10 10:39:51