EF Code First - Fluent API - 多对多关系 - 不创建表

时间:2016-06-18 14:35:00

标签: c# entity-framework

我有一个实体,我想创建两个多对多关系。我的实体是:

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        Property(u => u.FirstName).HasMaxLength(50).IsRequired();
        Property(u => u.LastName).HasMaxLength(50).IsRequired();

        HasMany<User>(u => u.Users).WithMany(f => f.Followers).Map(m =>
        {
            m.ToTable("UserFollower");
            m.MapLeftKey("UserId");
            m.MapRightKey("FollowerId");                
        });
        HasMany<User>(u => u.Users).WithMany(f => f.Followings).Map(m =>
        {
            m.ToTable("UserFollowing");
            m.MapLeftKey("UserId");
            m.MapRightKey("FollowingId");
        });
    }
}

我的配置类如下所示:

UserFollowing

此代码仅创建一个表UserFollowing,而不是两个表UserFollowerUserFollower。如果我交换表格的位置,那么我只得到ShouldBeEquivalentTo。似乎第二个表覆盖了第一个表。我试图删除迁移和数据库,但我仍然得到相同的结果。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,您尝试针对同一导航属性创建两个M:N映射 - 用户。你实际上并不需要这样做,而是为了你想要实现的目标。要映射哪个用户正在跟随哪个用户,您只需要一个映射表。

尝试设置如下:

    HasMany<User>(u => u.Following).WithMany(f => f.Followers).Map(m =>
    {
        m.ToTable("UserFollowing");
        m.MapLeftKey("UserId");
        m.MapRightKey("FollowingId");                
    });

现在,您可以访问“关注用户”以查找他们关注的对象,以及关注者以了解他们关注的对象。

我怀疑你实际上并不需要那个Users属性,至少是出于数据访问的目的。如果你想要一个结合了两者的列表,你可以使用get only属性来返回Follow和Followers集合的并集。