Lin*_*aby 6 c# many-to-many entity-framework-core
我找到了答案
实体框架核心:与同一实体的多对多关系, 并尝试这样做.
实体来说:
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; }
}
Run Code Online (Sandbox Code Playgroud)
流畅的API:
modelBuilder.Entity<Friend>()
.HasKey(f => new { f.MainUserId, f.FriendUserId });
modelBuilder.Entity<Friend>()
.HasOne(f => f.ManUser)
.WithMany(mu => mu.Friends)
.HasForeignKey(f => f.MainUserId);
modelBuilder.Entity<Friend>()
.HasOne(f => f.FriendUser)
.WithMany(mu => mu.Friends)
.HasForeignKey(f => f.FriendUserId);
Run Code Online (Sandbox Code Playgroud)
无法在'User.Friends'和'Friend.FriendUser'之间创建关系,因为'User.Friends'和'Friend.ManUser'之间已经存在关系.导航属性只能参与单个关系.
我该怎么办?或者我应该创建一个Entity FriendEntity:User?
问题是你不能有一个集合来支持一对多的关联.Friend有两个外键在它们引用的实体中都需要反向结束.所以添加另一个集合作为反向结束MainUser:
public class User
{
public int UserId { get; set; }
public virtual ICollection<Friend> MainUserFriends { get; set; }
public virtual ICollection<Friend> Friends { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和映射:
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);
Run Code Online (Sandbox Code Playgroud)
一个(或两个)关系应该没有级联删除以防止多个级联路径.
小智 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);
Run Code Online (Sandbox Code Playgroud)
看看这个:https://github.com/aspnet/EntityFramework/issues/6052
| 归档时间: |
|
| 查看次数: |
2504 次 |
| 最近记录: |