Je conçois d'abord ma base de données en utilisant du code et j'ai besoin d'un peu d'aide je pense.
Je reçois cette erreur:
L'introduction de la contrainte FOREIGN KEY 'SalesOrder_Invoices' sur la table 'Invoices' peut provoquer des cycles ou plusieurs chemins de cascade. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifiez d'autres contraintes FOREIGN KEY.
Impossible de créer une contrainte. Voir les erreurs précédentes.
J'essaie d'avoir les relations/clés suivantes:
--> = 1 to Many Relationship
J'essaie de les définir par la norme de:
<ClassName><PrimaryKeyID>
Exemple: Customer
a la propriété ID
, donc dans CustomerLocation
je définis la clé étrangère comme ceci:
Public Property CustomerID AS Integer
Tout ce que je dois faire est de définir la clé étrangère correcte? Dois-je également avoir des propriétés de navigation pour chaque clé que je définis?
Et, ne puis-je pas avoir plusieurs clés étrangères sur la même clé primaire d'un objet?
mis à jour
Donc, pour définir une relation, utilisez-vous le ClassName.PrimaryKeyProperty
? ou utilisez-vous des propriétés de navigation? Ou les deux? Confus!!
mise à jour 2
Donc, pour faire fonctionner une relation, vous devez définir les deux côtés ... Je pense.
Public Class Customer
Public Property ID AS Integer
Public Overrideable Property Locations AS ICollection(OF CustomerLocation)
End Class
Public Class CustomerLocation
Public Property ID AS Integer
Public Property CustomerID AS Integer
End Class
Il s'agit d'une exception provoquée par SQL Server lorsque vous disposez de plusieurs chemins de suppression en cascade. Si vous supprimez votre PaymentTerm, cela déclenchera une suppression en cascade sur les trois relations. Cela explosera lors de la création de SalesOrder
ou Invoice
. EF crée par défaut toutes les relations un-à-plusieurs avec ON DELETE CASCADE
Vous pouvez remapper votre relation spécifique pour ne pas l'utiliser en:
modelBuilder.Entity<...>()
.HasRequired(...)
.WithMany(...)
.HasForeignKey(...)
.WillCascadeOnDelete(false);
Ou vous pouvez le désactiver globalement en supprimant la convention:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
Vous pouvez contourner cette erreur sur une migration particulière en modifiant la méthode Up()
générée avec une ligne semblable à ceci:
AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true)
et remplacez cette valeur cascadeDelete:
par false sur la ou les relations incriminées.
Lisez ceci , je suis sûr que cela vous aidera à trouver la réponse.
De plus, selon ScottGu blogpost , je pense qu'en général, vous devriez créer les classes comme suit (je ne l'ai pas lu suffisamment attentivement, vous devriez donc le vérifier pour plus de détails):
public class Customer
{
public int CustomerID { get; set; }
public int CustomerLocationID { get; set; }
public virtual CustomerLocation Location { get; set; }
}
public class CustomerLocation
{
public int CustomerLocationID { get; set; }
public virtual ICollection<Customer> Customers { get; set; }
}