我有一个具有以下设置的模型:
成员可以是多个成员列表的成员。成员列表可以有多个成员。我还定义了一个成员列表可以有一组单独的可选成员。基本上我在成员和成员列表之间有一个双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代码优先?如果是这样,那么解决我遇到的映射问题的最佳方法是什么?
我总是可以更改模型,以便它具有将成员链接到成员列表的成员实体。它使整个事情更加明确,然后我可以向该实体添加属性以将其标记为可选。
然而,我认为这是一个应该有效的方案,所以我希望之前有人这样做,并知道让它正常工作的诀窍。答案 0 :(得分:9)
您的所有映射都包含.WithMany(member => member.MemberLists)
。那是不对的。每个关系需要单独的导航属性=您只能将每个导航属性用于一个关系映射。