我的课程可能如下:
public class Group
{
public int Id {get; set;}
public ICollection<Group> IsMemberOf {get; set;}
}
群组可以是其他群组的成员。 Id db我有表Group和表GroupGroup。在ModelBuilder中,我使用此代码来定义映射。
modelBuilder.Entity<GroupGroup>()
.ToTable("GroupGroup")
.HasKey(e => new { e.GroupId, e.MemberGroupId });
modelBuilder.Entity<Group>()
.ToTable("Group")
.Ignore(e => e.IsMemberOf);
好吧,我的问题是如何使用Fluent API将关联表GroupGroup中的组映射到属性IsMemberOf?我是ef,Fluent API的新手,我知道我应该让ef创建自己的关系表,但由于与AD和其他系统的连接,我必须使用这种方式。有没有办法实现这个目标?
非常感谢任何暗示。
答案 0 :(得分:0)
由于此GroupGroup
关联表,您似乎需要多对多关联。映射它的一种方法是:
modelBuilder.Entity<Group>()
.HasMany(g => g.IsMemberOf)
.WithMany()
.Map(m => m.MapLeftKey("ChildGroupId")
.MapRightKey("GroupId")
.ToTable("GroupGroup")
);
这意味着您的班级模型中没有GroupGroup
实体类。如果执行LINQ语句,则EF通过设置所有必需的连接来填充IsMemberOf
集合:
var groups = context.Groups.Include(g => g.IsMemberOf).ToList();
我不知道为什么你的映射中有这一行.Ignore(e => e.IsMemberOf)
,但是应该删除它。
您甚至可以双向进行映射:
public class Group
{
public int Id {get; set;}
public ICollection<Group> IsMemberOf { get; set; }
public ICollection<Group> HasMembers { get; set; }
}
映射:
modelBuilder.Entity<Group>()
.HasMany(g => g.IsMemberOf)
.WithMany(g => g.HasMembers)
.Map(m => m.MapLeftKey("ChildGroupId")
.MapRightKey("GroupId")
.ToTable("GroupGroup")
);