Sto cercando di mappare la relazione molti-a-molti con la stessa entità. L'entità User
ha un campo di dati IList<User>
per Contacts
, che memorizza le informazioni sui contatti / amici degli utenti:
public class User : DomainModel
{
public virtual IList<User> Contacts { get; protected set; }
//irrelevant code omitted
}
Quando provo a utilizzare l'API fluente per mappare questa relazione da molti a molti, mi dà qualche problema. Apparentemente, quando uso HasMany()
nella proprietà user.Contacts
, non ha alcun metodo WithMany()
per chiamare next. L'intellisense di Visual Studio mostra solo WithOne()
, ma non WithMany()
.
modelBuilder.Entity<User>().HasMany(u => u.Contacts).WithMany()
// gives compile time error: CS1061 'CollectionNavigationBuilder<User, User>' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type
Quindi perché succede? C'è qualcosa che ho sbagliato a mappare questa relazione molti-a-molti?
Quindi perché succede? C'è qualcosa che ho sbagliato a mappare questa relazione molti-a-molti?
No, non hai fatto niente di sbagliato. Non è supportato . Stato attuale qui .
Le relazioni many-to-many senza una classe entity per rappresentare la tabella join non sono ancora supportate. Tuttavia, è possibile rappresentare una relazione molti-a-molti includendo una classe di entità per la tabella di join e mappando due relazioni uno-a-molti separate.
Con EF-Core dovresti creare l'entità per la tabella di mappatura. Come UserContacts
. Un esempio completo nei documenti , come menzionato nei commenti. Non ho in realtà testato il codice qui sotto, ma dovrebbe assomigliare a questo:
public class UserContacts
{
public int UserId { get; set; }
public virtual User User { get; set; }
public int ContactId { get; set; } // In lack of better name.
public virtual User Contact { get; set; }
}
public class User : DomainModel
{
public List<UserContacts> Contacts { get; set; }
}
E il tuo modelBuilder
.
modelBuilder.Entity<UserContacts>()
.HasOne(pt => pt.Contact)
.WithMany(p => p.Contacts)
.HasForeignKey(pt => pt.ContactId);
modelBuilder.Entity<UserContacts>()
.HasOne(pt => pt.User)
.WithMany(t => t.Contacts)
.HasForeignKey(pt => pt.UserId);