Entity Framework Code en premier: la contrainte FOREIGN KEY peut provoquer des cycles ou plusieurs chemins en cascade
Entity Framework Code First peut générer la base de données pour la suite de POCOs.
public class Item {
public int Id { get; set; }
public string Name { get; set; }
}
public class ItemPair {
public int Id { get; set; }
public virtual Item FirstItem { get; set; }
public virtual Item SecondItem { get; set; }
}
Je voudrais etablir la relation avec le Premier et le Deuxième élément via les champs ID, plutôt que la totalité d'un "Élément" de la classe. Donc:
public class ItemPair {
public int Id { get; set; }
public virtual Item FirstItem { get; set; }
public int FirstItem_Id { get; set; }
public virtual Item SecondItem { get; set; }
public int SecondItem_Id { get; set; }
}
fonctionne également. Modifier: Cela ne fait pas travailler. Juste génère plus de FirstItem_Id1 et SecontItem_Id2 colonnes.
Mais simplement de changer les propriétés de clés étrangères pour FirstItemId, SecondItemId, (sans le trait de soulignement) comme suit:
public class ItemPair {
public int Id { get; set; }
public virtual Item FirstItem { get; set; }
public int FirstItemId { get; set; }
public virtual Item SecondItem { get; set; }
public int SecondItemId { get; set; }
}
résultats de l'exception suivante.
{"Introducing FOREIGN KEY constraint 'ItemPair_SecondItem' on table 'ItemPair' 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."}
Pourquoi? Et que puis-je faire pour éviter cette exception.
source d'informationauteur Pauly
Vous devez vous connecter pour publier un commentaire.
Mon espoir est que dans le premier cas, votre Id de propriétés ne sont pas utilisés dans la base de données FKs et EF va créer deux colonnes (vous pouvez le valider en forçant le couplage de la propriété de navigation avec FK propriété à l'aide de
ForeignKeyAttribute
). Dans le second cas, EF reconnaître correctement vos propriétés, mais il utilise également supprimer en cascade convention qui sera la cause de l'erreur dans SQL server. Vous avez deux propriétés de la table de pointage pour le même parent. En fait dans la base de données vous pouvez créer desItemPair
de la mêmeItem
(les deux FKs ensemble pour le même Identifiant). Si les deux relations ont cascade de supprimer activé il en résulte de multiples cascade chemins => non permis dans SQL server.La solution ici est couramment cartographie de définir manuellement la façon dont les relations sont mappés. Ici est l'exemple.
J'ai décidé de supprimer le supprimer en cascade convention.
Les raisons sont:
Merci Ladislav Mrnka de me pointer dans la bonne direction.