Fluent API - 如何映射自定义关系 table?

Fluent API - how to map custom relation table?

我有 class 可能看起来像这样:

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

组可以是其他组的成员。 Id db 我有 table Group 和 table 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 将组从关系 table GroupGroup 映射到 属性 IsMemberOf?我对 ef、Fluent API 等非常陌生,我知道我应该让 ef 创建自己的关系 table,但由于连接到 AD 和其他系统,我必须使用这种方式。有什么办法可以做到这一点?

非常感谢任何提示。

看起来您需要一个多对多关联,因为这个 GroupGroup 关联 table。映射它的一种方法是:

modelBuilder.Entity<Group>()
    .HasMany(g => g.IsMemberOf)
    .WithMany()
    .Map(m => m.MapLeftKey("ChildGroupId")
               .MapRightKey("GroupId")
               .ToTable("GroupGroup")
        );

这意味着您的 class 模型中没有 GroupGroup 实体 class。如果您执行如下 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")
        );