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

Entity Framework Discussion :

comment avoir la gestion des clés primaires avec sql serveur/EF


Sujet :

Entity Framework

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut comment avoir la gestion des clés primaires avec sql serveur/EF
    salut,

    je lis actuellement un livre sur EF 4, et j'ai un problème lors d'un ajout d'une entité et de sa sauvegarde dans la base de données (SQL server 2008).
    j'ai créé une base dans sql server avec trois champs : id (int,primary key), nom(string,nulls autorisés), et telephone (string,nulls)
    dans visual studio, j'ai créé un EDM avec import de la base et de la table.

    le code suivant devrait ajouter une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var ctx = new personnes_dbEntities();
     
                personne p1=new personne(){nom = "durand",telephone = "0387654321"};
                ctx.AddTopersonnes(p1);
                ctx.SaveChanges();
    mais j'ai une erreur à l'exécution : il n'autorise pas la table "personne" à avoir deux valeurs identiques de la clé primaire.
    un petit test et j'ai vu que il assignait au champ "id" la valeur 0, valeur de l"id qui est déjà en base(je ne l'ai pas dit mais j'ai un peu rempli la base).

    ma question est : comment faire pour que le champ "id" soit géré automatiquement par sql server / VS?
    ajouter une contrainte dans sql server?
    modifier l'incrément de la colonne dans sql server?
    ne pas cocher l'item "ajouter un champ pour la clé primaire de l'entité" dans l'assistant d'ajout de fichier EDM?

    il y a plusieurs possibilités et comme recréer une base puis un projet avec un EDM est long à la longue, je m'en remets à vous!

    PS: en fait, l' exemple cité est un peu plus compliqué, le champ téléphone fait partie d'une autre table, c'était pour tester le mapping, mais je crois que cela ne joue pas sur le problème de clés primaires.

  2. #2
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Le champ id est-il autoincrémenté dans la base de données ?

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    salut,

    oui, j'ai modifié ma façon de créer les tables dans sql server, j'ai indiqué que le champ "id" est une clé primaire, je l'ai spécifié comme "entity column", et j'ai modifié l'auto-incrément (mis à 1).

    maintenant, j'ai l'erreur suivante:

    A value shared across entities or associations is generated in more than one location. Check that mapping does not split an EntityKey to multiple store-generated columns.
    tu as le mapping en photo jointe.
    voici le code:

    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
     
    namespace merge_tables_9
    {
        class Program
        {
            static void Main(string[] args)
            {
                var ctx = new personnes_db2Entities();
     
                personne p1=new personne(){nom="durand",telephone = "0387311524"};
                personne p2=new personne(){nom = "schmilblick",telephone = "0312545657"};
     
                ctx.AddTopersonnes(p1);
                ctx.AddTopersonnes(p2);
                ctx.SaveChanges();
     
                foreach (personne p in ctx.personnes)
                {
                    Console.WriteLine(p.id);
     
                }
     
     
     
                var s = Console.ReadLine();
     
            }
        }
    }
    olivier

  4. #4
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    http://social.msdn.microsoft.com/For...d-1a5419f495d4
    J'espère que ca résoudra ton problème

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    salut,

    ben ... en fait,non.

    la phrase qui me pose problème :

    You don't make the column in the subtype's table autogenerated: You need to allow the EF to set it since its value determined by the value generated in the root type's table.
    le début je comprends mais pas la fin, et je ne comprends pas la cause du problème.
    déjà, il y a une différence car je n'ai pas d'héritage entre entités.

    et, pour le début de la phrase, il s'agit de ne pas mettre d'autoincrément dans le champ, dans sql server?
    mais dans ce cas EF ne va pas le faire(autoincrémenter la clé, lors d'un insert)??

    si vous pouvez me guider plus, merci

    olivier

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    ...et j'ai un peu peur de toucher au fichier EDMX.
    si je commence, où ça finira?

    je préfère m'en passer.

  7. #7
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Pas besoin de toucher l'edmx pour une fonctionnalité aussi basique que celle-ci.

    Si tu insères directement des données dans la base (via Management Studio ou Visual Studio) tu as bien l'id qui s'auto incrémente ?

    As-tu regénéré l'edmx après avoir modifier la base (auto incrémentation de l'id) ? Tu peux essayer de recommencer de zéro en le recréant complètement.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    salut,

    ben en fait j'ai essayé d'entrer de nouvelles valeurs à partir du server explorer de VS et la clé est bien auto-incrémentée.
    mais à l'exécution j'ai toujours cette erreur:

    A value shared across entities or associations is generated in more than one location. Check that mapping does not split an EntityKey to multiple store-generated columns.

  9. #9
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    j'ai peut-être une explication : j'ai deux tables, "personne" (champs "id" et "nom") et "personne2" (champs "id" et "telephone").
    mon programme doit illustrer la fusion de 2 tables en une entité nommée "personne" (oui je sais ça prête à confusion), avec les champs "id","nom","telephone".

    si j'ajoute une ligne dans "personne" (je parle de la table dans la base), qui prend par exemple la valeur d'id 3, et que il faut ensuite stocker le téléphone (donc dans l'autre table, telephone2), peut-être que VS n'utilisera pas le même id dans "personne2" que celui utilisé dans "personne" (ici, 3).
    et comme il y a une relation entre "personne" et "personne2" dans la base cela créé un conflit.

    si vous n'avez pas compris, dites-le moi, je détaillerai plus.

    est-ce une explication possible?
    si oui, comment corriger le problème?

    olivier

  10. #10
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Si j'ai bien compris tu as 2 tables
    personne
    id (auto incrémenté)
    nom

    personne2
    id (autoincrémenté)
    téléphone

    et dans ton edmx tu merges les 2 tables en 1 seule entité.


    Si c'est bien cela le problème est normal car l'id est généré dans les 2 tables et peut être différent.
    Pour résoudre le problème il faut supprimer l'autoincrémentation de l'une de tes deux tables.

  11. #11
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    voici des nouvelles : j'ai réussi, ça marche!
    j'ai modifié la table personne2 en ne définissant pas de colonne identité, et le programme s' exécute alors bien.

    merci pour vos réponses,

    olivier

  12. #12
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 85
    Points : 47
    Points
    47
    Par défaut
    merci pour la solution elle m'a aidé

  13. #13
    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
    vous avez donc ajouté une FK entre personne2 et personne1?
    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. Gestion des clés primaires et étrangères
    Par jonrod dans le forum Designer
    Réponses: 5
    Dernier message: 10/04/2012, 10h38
  2. Comment avoir le design des tables avec ORACLE
    Par -Fly- dans le forum Débuter
    Réponses: 6
    Dernier message: 20/05/2011, 08h58
  3. [EJB3 Entity] gestion des clés primaires avec EJB3 !
    Par magnum_cl9 dans le forum Java EE
    Réponses: 6
    Dernier message: 17/07/2009, 17h43
  4. Réponses: 4
    Dernier message: 26/03/2009, 14h58
  5. Réponses: 5
    Dernier message: 12/03/2007, 10h21

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