IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Erreur de FOREIGN KEY constraint on table may cause cycles or multiple cascade paths.


Sujet :

ASP.NET MVC

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Erreur de FOREIGN KEY constraint on table may cause cycles or multiple cascade paths.
    Bonjour, j'ai un problème lors de ma commande update-database dans la console, j'obtiens l'erreur suivante:

    Introducing FOREIGN KEY constraint 'FK_dbo.Obligation_dbo.Maximum_MaximumID' on table 'Obligation' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

    Voici le modèle principal Client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    public class Client
        {
             public int ClientID
            {
                get;
                set;
            }
     
      public int Action_typeID
            {
                get;
                set;
            }
            public int ObligationID
            {
                get;
                set;
            }
             public virtual Action_type Action_types 
            {
                get;
                set;
            }
            public virtual Obligation Obligations
            {
                get;
                set;
            }
    et le modèle Obligation et Action_type ont exactement la meme structure:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public class Obligation
        {
            public int ObligationID
            {
                get;
                set;
            }
        public string Obligation_name
            {
                get;
                set;
            }
            public int MaximumID
            {
                get;
                set;
            }
         public virtual Maximum Maximums
            {
                get;
                set;
            }
    et Maximum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public int MaximumID
            {
                get;
                set;
            }
            public int value_max
            {
                get;
                set;
            }
    Je ne vois pas pourquoi j'obtiens cette erreur alors que j'ai deja eu fait ca et ca marchait très bien.
    Quelqu'un pourrait m'aider à résoudre ce problème.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Le souci est que par défaut toute tes relations 1-n sont obligatoires => EF va ajouter la contrainte ON DELETE CASCADE.

    Or quand on DELETE un Maximum :
    - CASCADE sur Obligation puis sur Client
    - CASCADE sur Action_type puis sur Client
    Donc Client se retrouve en bout de chaine 2 fois.

    La solution est de désactiver le DELETE CASCADE sur une des relations, ça devrait donner quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class TonContext : DbContext
    {
        ...
     
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Client>()
                        .HasRequired(f => f.Obligations)
                        .WithRequiredDependent()
                        .WillCascadeOnDelete(false);
        }
    }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Ok parfait merci beaucoup!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Je viens d'essayé selon votre code mais j'ai toujours la même erreur.

    Y aurait-il une solution ?

    Merci d'avance pour votre aide

  5. #5
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Hum ne serait-ce pas plutôt une autre erreur ?

    Voilà un exemple complet qui fonctionne chez moi (EF 6.1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public class Client
    {
        public int ClientID { get; set; }
     
        public int? Action_typeID { get; set; }
     
        public int? ObligationID { get; set; }
     
        public virtual Action_type Action_types { get; set; }
     
        public virtual Obligation Obligations { get; set; }
    }
     
    public class Obligation
    {
        public int ObligationID { get; set; }
     
        public string Obligation_name { get; set; }
     
        public int MaximumID { get; set; }
     
        public virtual Maximum Maximums { get; set; }
    }
     
    public class Action_type
    {
        public int Action_typeID { get; set; }
     
        public string Action_type_name { get; set; }
     
        public int MaximumID { get; set; }
     
        public virtual Maximum Maximums { get; set; }
    }
     
    public class Maximum
    {
        public int MaximumID { get; set; }
     
        public int value_max { get; set; }
    }
     
    class ClientsContext : DbContext
    {
        public DbSet<Client> Clients { get; set; }
     
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Client>()
                        .HasOptional(f => f.Obligations)
                        .WithOptionalDependent()
                        .WillCascadeOnDelete(false);
        }
    }
     
    class Program
    {
        static void Main(string[] args)
        {
            using (ClientsContext context = new ClientsContext())
            {
                Client client = new Client();
     
                context.Clients.Add(client);
     
                context.SaveChanges();
            }
        }
    }
    J'ai mis en optionnel certaines propriétés pour simplifier mes tests.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup cela fonctionne!

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/05/2015, 12h44
  2. Réponses: 2
    Dernier message: 06/03/2013, 17h20
  3. Réponses: 2
    Dernier message: 11/07/2012, 17h52
  4. Message d'erreur 'violation of FOREIGN KEY constraint' de Interbase
    Par abdelghani_k dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/06/2007, 09h11
  5. [MySQL] Create table : erreur sur foreign key
    Par Naksh-i dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/10/2006, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo