如何映射自定义关系表

本文关键字:自定义 关系 映射 何映射 | 更新日期: 2023-09-27 17:53:20

我有一个类,看起来像这样:

public class Group
{
    public int Id {get; set;}
    public ICollection<Group> IsMemberOf {get; set;}
}

Group可以是其他组的成员。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);

好吧,我的问题是如何映射组从关系表GroupGroup到属性IsMemberOf与Fluent API?我是非常新的ef,流利的API等,我知道我应该让我们创建自己的关系表,但我必须使用这种方式,因为连接到AD和其他系统。有什么办法可以做到这一点吗?

谢谢你的提示

如何映射自定义关系表

由于这个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")
        );