Sto cercando di creare un elenco telefonico con Entity Framework Core. Ogni volta che cerco di eseguire il comando: Add-Migration "Initial"
Ottengo il seguente errore: Unable to determine the relationship represented by navigation property 'Member.MemberTeam' of type 'Team'. Either manually configure the relationship, or ignore this property from the model.
Ecco i miei modelli:
public class Member {
public int Id { get; set; }
public string MemberName { get; set; }
public string MemberTitle { get; set; }
public Member MemberSupervisor { get; set; }
public Team MemberTeam { get; set; }
}
public class Team {
public int Id { get; set; }
public string TeamName { get; set; }
public Member TeamSupervisor { get; set; }
public ICollection<Member> TeamMembers { get; set; }
}
Qualche consiglio?
Esistono diverse relazioni tra Team
e Member
e tra Member
e Member
. Se tu avessi solo questo modello ...
public class Member
{
public int Id { get; set; }
public string MemberName { get; set; }
public string MemberTitle { get; set; }
public Team MemberTeam { get; set; }
}
public class Team
{
public int Id { get; set; }
public string TeamName { get; set; }
public ICollection<Member> TeamMembers { get; set; }
}
... EF non avrebbe bisogno di aiuto. Comprenderebbe che Team.TeamMembers
e Member.MemberTeam
sono due estremità di un'associazione.
Ora se aggiungi solo ...
public Member TeamSupervisor { get; set; }
... EF deve scegliere se questa è la fine inversa di un'associazione one-to-one con MemberTeam
o una nuova associazione oltre all'associazione one-to-many. Tuttavia, EF non sceglie per te, devi istruirlo in modo inequivocabile, mappando esplicitamente le associazioni. Ad esempio (nella sottoclasse DbContext
):
protected override void OnModelCreating(ModelBuilder mb)
{
mb.Entity<Team>().Property(a => a.Id).UseSqlServerIdentityColumn();
mb.Entity<Team>().HasMany(t => t.TeamMembers).WithOne(m => m.MemberTeam);
mb.Entity<Team>().HasOne(t => t.TeamSupervisor).WithMany()
.HasForeignKey("SupervisorId");
mb.Entity<Member>().Property(a => a.Id).UseSqlServerIdentityColumn();
mb.Entity<Member>().HasOne(m => m.MemberSupervisor).WithMany()
.HasForeignKey("SupervisorId");
}