EF Core - 课堂上的多对多关系

时间:2017-03-12 08:48:16

标签: c# many-to-many entity-framework-core

用户友情关系

我找到答案

Entity Framework Core: many-to-many relationship with same entity 并尝试这样。

实体来说:

Finish

流畅的API:

public class User
{
    public int UserId { get; set; }

    public virtual ICollection<Friend> Friends { get; set; }
}

public class Friend
{
    public int MainUserId { get; set; }

    public User ManUser { get; set; }

    public int FriendUserId { get; set; }

    public User FriendUser { get; set; }
}

当我添加迁移时,错误消息是

无法在'User.Friends'和'Friend.FriendUser'之间建立关系,因为'User.Friends'和'Friend.ManUser'之间已经存在关系。 导航属性只能参与一个关系。

我该怎么办?或者我应该创建一个Entity FriendEntity:User?

2 个答案:

答案 0 :(得分:6)

问题是您不能拥有一个集合来支持一对多关联。 Friend有两个外键,它们在所引用的实体中都需要反向结束。因此,将另一个集合添加为MainUser的反向结尾:

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<Friend> MainUserFriends { get; set; }
    public virtual ICollection<Friend> Friends { get; set; }
}

映射:

modelBuilder.Entity<Friend>()
    .HasKey(f => new { f.MainUserId, f.FriendUserId });

modelBuilder.Entity<Friend>()
    .HasOne(f => f.MainUser)
    .WithMany(mu => mu.MainUserFriends)
    .HasForeignKey(f => f.MainUserId).OnDelete(DeleteBehavior.Restrict);

modelBuilder.Entity<Friend>()
    .HasOne(f => f.FriendUser)
    .WithMany(mu => mu.Friends)
    .HasForeignKey(f => f.FriendUserId);

一个(或两个)关系应该没有级联删除以防止多个级联路径。

答案 1 :(得分:5)

第二个系列不是强制性的。你只需要将de .WithMany()留空如下:

modelBuilder.Entity<Friend>()
    .HasOne(f => f.MainUser)
    .WithMany()
    .HasForeignKey(f => f.MainUserId);

modelBuilder.Entity<Friend>()
    .HasOne(f => f.FriendUser)
    .WithMany()
    .HasForeignKey(f => f.FriendUserId);

看看这个:https://github.com/aspnet/EntityFramework/issues/6052