Entity Framework 4.1 Atributo InverseProperty e ForeignKey

Eu criarei duas referências entre as entidades Employee e Team com foreign keys. Então eu defini duas entidades como segue

public class Employee { public int EmployeeId { get; set; } public string Name { get; set; } [ForeignKey("FirstTeam")] public int FirstTeamId { get; set; } [InverseProperty("FirstEmployees")] public virtual Team FirstTeam { get; set; } [ForeignKey("SecondTeam")] public int SecondTeamId { get; set; } [InverseProperty("SecondEmployees")] public virtual Team SecondTeam { get; set; } } public class Team { public int Id { get; set; } public string TeamName { get; set; } [InverseProperty("FirstTeam")] public virtual ICollection FirstEmployees { get; set; } [InverseProperty("SecondTeam")] public virtual ICollection SecondEmployees { get; set; } } 

Eu pensei que é correto teoricamente, mas mostra a exceção da seguinte forma:

 {"Introducing FOREIGN KEY constraint 'Employee_SecondTeam' on table 'Employees' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.\r\nCould not create constraint. See previous errors."} 

Alguém pode me ajudar?

Obrigado antecipadamente Kwon

É teoricamente correto, mas o SQL Server (não o Entity Framework) não gosta porque seu modelo permite que um único funcionário seja um membro da primeira e da segunda equipe. Se a Team for excluída, isso causará vários caminhos de exclusão para a mesma entidade de Employee .

Isso não pode ser usado junto com exclusões em cascata que são usadas por padrão no código EF primeiro se você definir a chave estrangeira como obrigatória (não anulável).

Se você quiser evitar a exceção, você deve usar o mapeamento fluente:

 public Context : DbContext { public DbSet Employees { get; set; } public DbSet Teams { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasRequired(e => e.SecondTeam) .WithMany(t => t.SecondEmployees) .HasForeignKey(e => e.FirstTeamId) .WillCascadeOnDelete(false); ... } } 

Isso resultará em um cenário no qual você deve excluir membros do SecondTeam manualmente antes de excluir a equipe.

Tudo está correto na resposta anterior, mas uma coisa está errada

  modelBuilder.Entity() .HasRequired(e => e.SecondTeam) .WithMany(t => t.SecondEmployees) .HasForeignKey(e => e.SecondTeamId) // mistake .WillCascadeOnDelete(false); 

FirstTeamId vez de SecondTeamId fará com que na propriedade de SecondTeam navigation seja sempre FirstTeam