31 votes

Entity Framework 4.1 InverseProperty Attribute et ForeignKey

Je vais créer deux références entre des entités Employee et Team avec des clés étrangères. J'ai donc défini deux entités comme suit

 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<Employee> FirstEmployees { get; set; }

    [InverseProperty("SecondTeam")]
    public virtual ICollection<Employee> SecondEmployees { get; set; }
}
 

Je pensais que c'était correct théoriquement, mais cela montre l'exception comme suit:

 {"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."}
 

Quelqu'un peut-il m'aider?

Merci d'avance Kwon

54voto

Ladislav Mrnka Points 218632

Il est théoriquement correct, mais SQL server (pas Entity framework) ne l'aime pas parce que votre modèle permet à l'employé d'être membre à la fois de la Première et de la Deuxième équipe. Si l' Team est supprimé, ce sera la cause de suppression de plusieurs chemins vers le même Employee de l'entité.

Ce ne peut pas être utilisé avec des suppressions en cascade qui sont utilisés par défaut dans les EF abord le code si vous définissez la clé étrangère obligatoire (non nullable).

Si vous voulez éviter l'exception que vous devez utiliser couramment la cartographie:

public Context : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Team> Teams { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Employee>()
                    .HasRequired(e => e.SecondTeam)
                    .WithMany(t => t.SecondEmployees)
                    .HasForeignKey(e => e.FirstTeamId)
                    .WillCascadeOnDelete(false);

        ...
    }
}

Cela se traduira dans le scénario où vous devez supprimer les membres de SecondTeam manuellement avant de supprimer l'équipe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X