web-dev-qa-db-fra.com

Entity Framework Code First - Définition des relations / clés

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
  1. Client -> Emplacement client
  2. CustomerLocation -> SalesOrder
  3. SalesOrder -> Facture
  4. SalesRep -> SalesOrder
  5. PaymentTerm -> Client
  6. PaymentTerm -> SalesOrder
  7. PaymentTerm -> Facture

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
38
Sam

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.

97
Ladislav Mrnka

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; }
}
4
Shimmy