使用实体框架代码优先映射多个关系的问题

时间:2011-06-01 21:19:12

标签: c# .net entity-framework entity-framework-4.1 ef-code-first

方案

我有一个具有以下设置的模型:

成员可以是多个成员列表的成员。成员列表可以有多个成员。我还定义了一个成员列表可以有一组单独的可选成员。基本上我在成员和成员列表之间有一个双n-m关系。更重要的是,成员列表始终由成员拥有,成员是创建成员列表的成员。

问题

实体框架代码优先无法正确映射此关系,尽管我告诉它如何映射关系。当我第一次尝试使用DbContext时出现以下错误

Schema specified is not valid. Errors: 
(32,6) : error 0040: Type MemberList_Members is not defined in namespace NerdCooking.Models (Alias=Self).
(33,6) : error 0040: Type MemberList_OptionalMembers is not defined in namespace NerdCooking.Models (Alias=Self).

我尝试了什么

首次尝试在场景中使用该模型失败,因为很明显EF不知道如何映射n-m关系。所以我明确告诉框架如何解决问题。

// Map the relation between members of a memberlist and the memberlist
// to a Membership table
modelBuilder.Entity<MemberList>().HasMany(memberList => memberList.Members)
    .WithMany(member => member.MemberLists)
    .Map(mapping => mapping.MapLeftKey("MemberId")
        .MapRightKey("MemberListId").ToTable("Membership"));

// Map the relation between optional members of a memberlist and the memberlist
// to a separate table
modelBuilder.Entity<MemberList>().HasMany(memberList => memberList.OptionalMembers)
    .WithMany(member => member.MemberLists)
    .Map(mapping => mapping.MapLeftKey("MemberId")
        .MapRightKey("MemberListId").ToTable("OptionalMembership"));

// Map the relationship between the owner and the memberlist
modelBuilder.Entity<MemberList>().HasRequired(memberList => memberList.Owner)
    .WithMany(member => member.MemberLists).WillCascadeOnDelete(true);

我的问题

这种情况是否可以使用Entity framework 4.1代码优先?如果是这样,那么解决我遇到的映射问题的最佳方法是什么?

我总是可以更改模型,以便它具有将成员链接到成员列表的成员实体。它使整个事情更加明确,然后我可以向该实体添加属性以将其标记为可选。

然而,我认为这是一个应该有效的方案,所以我希望之前有人这样做,并知道让它正常工作的诀窍。

1 个答案:

答案 0 :(得分:9)

您的所有映射都包含.WithMany(member => member.MemberLists)。那是不对的。每个关系需要单独的导航属性=您只能将每个导航属性用于一个关系映射。