Trovo una risposta
Entity Framework Core: relazione molti-a-molti con la stessa entità e provare in questo modo.
Entitys:
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; }
}
L'API fluente:
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);
Impossibile creare una relazione tra "User.Friends" e "Friend.FriendUser", perché esiste già una relazione tra "User.Friends" e "Friend.ManUser". Le proprietà di navigazione possono partecipare solo a una singola relazione.
Cosa dovrei fare? O dovrei creare un'entità FriendEntity: utente?
Il problema è che non è possibile avere una raccolta per supportare entrambe le associazioni uno-a-molti. Friend
ha due chiavi esterne che hanno entrambe bisogno di una fine inversa nell'entità a cui si riferiscono. Quindi aggiungi un'altra raccolta come fine inversa di MainUser
:
public class User
{
public int UserId { get; set; }
public virtual ICollection<Friend> MainUserFriends { get; set; }
public virtual ICollection<Friend> Friends { get; set; }
}
E la mappatura:
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);
Uno (o entrambi) delle relazioni dovrebbe essere senza eliminazione a cascata per impedire più percorsi a cascata.
Non è obbligatorio la seconda raccolta. Devi solo lasciare de .WithMany () vuoto in questo modo:
modelBuilder.Entity<Friend>()
.HasOne(f => f.MainUser)
.WithMany()
.HasForeignKey(f => f.MainUserId);
modelBuilder.Entity<Friend>()
.HasOne(f => f.FriendUser)
.WithMany()
.HasForeignKey(f => f.FriendUserId);
guarda questo: https://github.com/aspnet/EntityFramework/issues/6052