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

时间:2016-06-29 07:22:05

标签: c# sql entity-framework fluent

我的课程可能如下:

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和其他系统的连接,我必须使用这种方式。有没有办法实现这个目标?

非常感谢任何暗示。

1 个答案:

答案 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")
        );