我有一个实体,我想创建两个多对多关系。我的实体是:
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
,而不是两个表UserFollower
和UserFollower
。如果我交换表格的位置,那么我只得到ShouldBeEquivalentTo
。似乎第二个表覆盖了第一个表。我试图删除迁移和数据库,但我仍然得到相同的结果。
有人知道为什么会这样吗?
答案 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集合的并集。