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 :

ajout dans la table qui contient le FK (relation 1 - *)


Sujet :

Entity Framework

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut ajout dans la table qui contient le FK (relation 1 - *)
    salut,

    la relation entre les deux tables sous sql server 2008 est configurer correctement avec la relation (1 *)
    table 1 : Tournee (ID,date,...) , ID c'est le PK
    table 2 : Position (ID, date,...) , ID c'est le PK et aussi elle contient le FK : TourneeID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Tournee tournee = new Tournee() { ID = 17 /* cette ID existe dans la table tournee*/};
    Position position = new Position();
      position.Tournee = tournee;
      position.Longitude = Longitude;
      position.DateHeurePosition = DateH;
                    db.AttachTo("Tournee", tournee);
                    db.AddToPosition(position);
                    db.SaveChanges();
    Quand je teste ce code il m'affiche une erreur :

    Un objet ayant la même clé existe déjà dans ObjectStateManager. ObjectStateManager ne peut pas assurer le suivi de plusieurs objets ayant la même clé.

    Y'a t'il quelqu'un peut me corriger cette erreur.
    Merci

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Dans la table Position, la colonne ID est-elle auto-incrémentée ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    non

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ok donc c'est à toi de gérer l'ID... :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var position = new Position()
    {
        Id = GetMaxId() + 1,
        Tournee = tournee,
        Longitude = longitude,
        DateHeurePosition = DateH
    };
     
    db.AddToPosition(position);
    db.SaveChanges();
    Ici j'ai mis une méthode GetMaxId, qui est censée retourner l'ID le plus grand dans la table Position. On l'incrémente de 1 afin d'utiliser un ID disponible...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    désolé , ID dans la table position est auto-incrémenté

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    mais dans la table position on trouve TourneeID comme étant un clé étangére qui va reçoit automatiquement ID de la table tournée puisqu'il y a une relation 1 * entre c'est 2 table, quant j'essaie d'ajouté une nouvelle ligne de la table position, il va être m'affiche une erreur qu'on a montrer au dessus.

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    L'erreur que tu as mentionné n'a rien à voir avec la clef de l'objet Tournée. Le problème se situe au niveau de l'ID de l'objet Position.

    Si tu as rajouté l'auto-incrémentation dans la base de données entre tes deux posts, je te conseille de regénérer ton modèle afin de s'assurer que l'auto-incrémentation est bien prise en compte par EF.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    je régénérai le modèle mais toujours la même problème.

    le problème c'est quand j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Tournee tour = new Tournee() { ID = TourneeID };
                   db.AttachTo("Tournee", tour);
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Position position = new Position();
     position.Tournee = tour;
    l'ID de la table position prend TourneeID est puisqu'il est auto-incrémentale et existe déjà dans la table il m'affiche cette erreur.

    et moi tout ce que je veux c'est que tourneeID dans la table position qui est la clé étrangère prend la valeur TourneeID a partir de la table Tournee

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il y a un problème de conception. Ca aurait fonctionné si tu avais une relation 1:1. Mais là comme tu as une relation 1:N, il faut que tu aies un ID indépendant, donc il faut que tu rajoutes une colonne ID dans la table Position (elle sera la clef primaire), et avoir une colonne "TourneeID", qui sera la clef étrangère (éventuellement intégrée à la clef primaire).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Le problème viendrait du fait qu'il exsite déjà une instance de la classe Tournee "trackée" par ton contexte et qui aurait le même Id que celle que tu essaie d'attacher.

    Vérifies que tu l'aurais pas déjà charger ? Si oui, alors tu n'as pas besoin de l'attacher mais juste de récupérer l'instance déjà chargée.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    donc il faut que tu rajoutes une colonne ID dans la table Position (elle sera la clef primaire), et avoir une colonne "TourneeID", qui sera la clef étrangère (éventuellement intégrée à la clef primaire).
    j'ai fait dés le départ comme vous te dit maintenant ( dans la table position on ID: PK et TourneeID: FK) et puisque il y'a une référence entre les deux tables je peut pas ajouter des données dans la table position ,

    est ce que vous pouvez me proposer une méthode pour résoudre ce problème

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Le problème viendrait du fait qu'il exsite déjà une instance de la classe Tournee "trackée" par ton contexte et qui aurait le même Id que celle que tu essaie d'attacher.

    Vérifies que tu l'aurais pas déjà charger ? Si oui, alors tu n'as pas besoin de l'attacher mais juste de récupérer l'instance déjà chargée.
    j'ai pas bien comprendre le problème que vous m'expliquer

Discussions similaires

  1. [AC-2000] Comment rechercher une valeur dans une table qui contient des paliers
    Par ClaudeLELOUP dans le forum Access
    Réponses: 16
    Dernier message: 13/07/2012, 16h43
  2. suppression dans une table qui contient une clé etrangère
    Par zana74 dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 08/08/2006, 10h58

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