38 votes

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

Je suis de la conception de ma base de données en utilisant le premier code et j'ai besoin d'un peu d'aide je pense.

J'obtiens cette erreur:

L'introduction de la contrainte de CLÉ ÉTRANGÈRE 'SalesOrder_Invoices' sur la table 'Factures' peut provoquer des cycles ou en cascade de plusieurs chemins. Spécifier on DELETE NO ACTION ou de la mise À JOUR, AUCUNE ACTION, ou modifier d'autres contraintes de CLÉ ÉTRANGÈRE.
N'a pas pu créer de contrainte. Voir les erreurs précédentes.

Je suis en train d'avoir des relations suivantes/touches:

--> = 1 to Many Relationship
  1. Client --> CustomerLocation
  2. CustomerLocation --> SalesOrder
  3. SalesOrder --> Facture
  4. SalesRep --> SalesOrder
  5. PaymentTerm --> Client
  6. PaymentTerm --> SalesOrder
  7. PaymentTerm --> Facture

Je suis en train de définir le standard de:

<ClassName><PrimaryKeyID>

Exemple: Customer a ID de la propriété, de sorte que, en CustomerLocation - je définir la clé étrangère de la sorte:

Public Property CustomerID AS Integer

Tout ce que j'ai à faire est de définir la clé étrangère correct? Dois-je également avoir les propriétés de navigation pour chaque touche, j'définir?

Et, je ne peux pas avoir plusieurs clés étrangères sur la même clé primaire d'un objet?

Mise à jour

Afin de définir une relation, utilisez-vous l' ClassName.PrimaryKeyProperty? ou utilisez-vous les propriétés de navigation? Ou les deux? Confus!!

Mise à jour 2

Donc, pour faire une relation de travail, 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

97voto

Ladislav Mrnka Points 218632

C'est l'exception provoquée par SQL server lorsque vous avez plusieurs chemins de suppressions en cascade. Si vous supprimez votre PaymentTerm il sera le déclencheur d'effacer en cascade sur l'ensemble des trois relations. Cela va exploser lors de la création soit SalesOrder ou Invoice. EF crée par défaut un-à-plusieurs relations avec des ON DELETE CASCADE , vous pouvez reconfigurer votre relation spécifique à ne pas l'utiliser par:

modelBuilder.Entity<...>()
            .HasRequired(...)
            .WithMany(...)
            .HasForeignKey(...)
            .WillCascadeOnDelete(false);

Ou vous pouvez le désactiver globalement en retrait de la convention:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();   

Vous pouvez contourner cette erreur sur un particulier de la migration en modifiant le générés Up() méthode avec une ligne quelque chose comme ceci:

AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true)

et le changement qu' cascadeDelete: de la valeur à false sur la délinquance relation(s).

4voto

Shimmy Points 23393

Lisez ceci, je suis sûr que cela va vous aider à trouver la réponse.

Aussi, selon ScottGu de l' article sur le blog, je pense qu'en général, il doit être que vous venez de créer les classes comme suit (je ne l'ai pas lu assez attentivement, de sorte que vous devriez 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; }
}

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