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

Accès aux données Discussion :

Clefs étrangères - BDD Code first


Sujet :

Accès aux données

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 26
    Points : 22
    Points
    22
    Par défaut Clefs étrangères - BDD Code first
    Bonjour,

    Je suis bloqué sur une erreur pour laquelle le débogueur ne m'est plus d'aucune aide...
    Je travaille sous VS 2015 (Community) en C#, pour une application web (ASP .Net).

    Je génère une base de données en code first. Notammen les tables Produit, Lot, et le lien entre les deux : LotProduit, qui permet à chaque Lot de disposer de plusieurs Produits, et à chaque Produit d'appartenir à plusieurs Lots, ainsi que de définir la quantité d'un même Produit dans chaque Lot.

    Lot :
    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
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
     
    namespace Akebia.Models
    {
        public class Lot
        {
            [Required, Display(Name = "LotID")]
            public int LotID { get; set; }
     
            public string libelle { get; set; }
     
            public double? prixSansEtui { get; set; }
     
            public double? prixEtuiSouple { get; set; }
     
            public double? prixEtuiRigide { get; set; }
        }
    }
    Produit :
    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
    using System.ComponentModel.DataAnnotations;
     
    namespace Akebia.Models
    {
     
        public class Produit
        {
            [Key, Required, Display(Name = "ProduitId")]
            public long produitID { get; set; }
     
            [Required, Display(Name = "Code article")]
            public long CodeArticle { get; set; }
     
            [Required, StringLength(40), Display(Name = "Libellé")]
            public string Libelle { get; set; }
     
            [Required, StringLength(20), Display(Name = "Référence")]
            public string Reference { get; set; }
     
            [Display(Name = "Prix de revient")]
            public double? PrixRevient { get; set; }
     
            [Display(Name = "Prix de vente")]
            public double? PrixVente { get; set; }
     
            [Display(Name = "Quantité")]
            public int? Quantite { get; set; }
     
            public int? CategorieID { get; set; }
     
            public virtual Categorie Categorie { get; set; }
        }
    }
    LotProduit :
    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
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
     
    // Association des produits avec les lots
    namespace Akebia.Models
    {
        public class LotProduit
        {
            [Required]
            public int LotID { get; set; }
     
            [Required]
            [ForeignKey("LotID")]
            public virtual Lot lot { get; set; }
     
            [Required]
            public int produitId { get; set; }
     
            [Required]
            [ForeignKey("produitId")]
            public virtual Produit produit { get; set; }
     
            [Required]
            public int? quantite { get; set; }
     
        }
    }
    Je génère mes tables avec le code suivant :
    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
    using System.Data.Entity;
    namespace Akebia.Models
    {
        public class ProduitContext : DbContext
        {
            public ProduitContext() : base("Akebia")
            {
            }
            public DbSet<Categorie> Categories { get; set; }
            public DbSet<Produit> Produit { get; set; }
            public DbSet<CartItem> ShoppingCartItems { get; set; }
            public DbSet<Lot> Lot { get; set; }
            public DbSet<Client> Client { get; set; }
            public DbSet<LotProduit> LotProduit { get; set; } 
     
     
        }
    }
    Mon problème :

    J'ai une erreur au lancement de l'application : la base de donnée ne se met pas à jour en créant les tables demandées. J'ai l'erreur suivante :
    Citation Envoyé par Visual Studio
    Une exception de type 'System.Data.Entity.ModelConfiguration.ModelValidationException' s'est produite dans EntityFramework.dll mais n'a pas été gérée dans le code utilisateur

    Informations supplémentaires : One or more validation errors were detected during model generation:
    Je suppose que cela vient de ma définition de LotProduit, car jusqu'à présent je n'avais que les deux tables distinctes Lot et Produit qui fonctionnaient très bien et sur lesquelles je pouvait travailler.
    Le fait d'avoir 2 FK ne devrait pas être un soucis, et jusqu'à présent le [Key] implicite fonctionnait, j'en espérait autant dans ce cas où je ne savais pas trop comment définir ces 2 FK comme une seule PK.

    J'espère que vous pourrez m'aider. Merci d'avance pour vos réponses.

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    je ne connais pas EntityFramework, par contre le message de l'exception semble incomplet.
    Essaie d'avoir le reste pour qu'on puisse trouver ton souci.
    Plus je connais de langages, plus j'aime le C.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Salut,

    Tu as raison : il y a un message plus complet dans les détails (et je ne l'avais pas vu) :
    "One or more validation errors were detected during model generation:
    Akebia.Models.LotProduit: : EntityType 'LotProduit' has no key defined. Define the key for this EntityType.
    LotProduit_produit_Target_LotProduit_produit_Source: : The types of all properties in the Dependent Role of a referential constraint must be the same as the corresponding property types in the Principal Role. The type of property 'produitId' on entity 'LotProduit' does not match the type of property 'produitID' on entity 'Produit' in the referential constraint 'LotProduit_produit'.
    LotProduit: EntityType: EntitySet 'LotProduit' is based on type 'LotProduit' that has no keys defined.
    Voilà qui précise les choses : Ma clef étrangère n'est pas bien définie, mauvais type... Bon, j'ai réglé ce soucis m'y voilà maintenant avec celui-là:

    One or more validation errors were detected during model generation:
    Akebia.Models.LotProduit: : EntityType 'LotProduit' has no key defined. Define the key for this EntityType.
    LotProduit: EntityType: EntitySet 'LotProduit' is based on type 'LotProduit' that has no keys defined.
    Donc c'est bien ce soucis de PK qui l'empêche de générer la base. Il ne peut pas se débrouiller avec 2 FK et comprendre que c'est une table d'association?
    Parce que dans cette table, typiquement je n'ai pas Une PK mais l'association des 2 FK devrait être équivalente à une PK...
    Ou alors j'ajoute un ID association en PK (mais c'est laid!).

    Edit: Résolu

    Bon, j'ai trouvé comment procéder en cherchant sur le 'ternet :
    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
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
     
    // Association des produits avec les lots
    namespace Akebia.Models
    {
        public class LotProduit
        {
            [Column(Order = 0), Key, Required]
            public int LotID { get; set; }
     
            [Required]
            [ForeignKey("LotID")]
            public virtual Lot lot { get; set; }
     
            [Column(Order = 1), Key, Required]
            public long produitID { get; set; }
     
            [Required]
            [ForeignKey("produitID")]
            public virtual Produit produit { get; set; }
     
            [Required]
            public int? quantite { get; set; }
     
        }
    }
    Il faut préciser [Key] dans les ID qui servent de FK (pas sur les entités virtuelles !) ainsi qu'un Column Order pour qu'il ne hurle pas au conflit.

    Merci bien pour ton aide jopomk, j'étais stupidement coincé sur "Une erreur s'est produite" que je n'ai même pas vu ou songé à trouver un message plus complet qui m'aurait permis de m'en tirer tout seul.

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Content pour toi. Des fois il suffit d'un regard externe pour trouver soi-même la solution
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Toute entité doit avoir une PK! ne cherchez pas plus loin.

    C'est la base de la modélisation...

    C'est d'ailleurs le problèmes lors du mappage de certaines vues dans l'EDMX qui va placer une clé (parfois fausse) avec au final un problème de données lors du chargement.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Export de BDD avec Entity Framework Code First
    Par thor76160 dans le forum Entity Framework
    Réponses: 2
    Dernier message: 02/07/2013, 16h05
  2. Les clefs étrangères dans sa BDD
    Par dafpp dans le forum Débuter
    Réponses: 8
    Dernier message: 14/10/2011, 18h48
  3. 5 clefs étrangères?
    Par P@t dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/05/2005, 16h52
  4. [wamp5] [Relations] Clefs étrangéres
    Par nebule dans le forum Outils
    Réponses: 6
    Dernier message: 05/10/2004, 11h17
  5. [SQL SERVER 2000] Problème clef étrangére
    Par Tankian dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/05/2004, 10h44

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