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 :

Edmx : Ajout d'une donnée avec Foreign Key, erreur alors que la relation a été définie


Sujet :

Accès aux données

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut Edmx : Ajout d'une donnée avec Foreign Key, erreur alors que la relation a été définie
    Bonjour,
    j'ai l'erreur suivante lorsque je tente d'ajouter un élément dans une table depuis le code C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Data.UpdateException: Entities in 'GestionAssociationEntities.T_Villes' participate in the 'FK_T_Villes_T_Pays' relationship. 0 related 'T_Pays' were found. 1 'T_Pays' is expected.
    Or, lorsque je fais le même ajout depuis SQL Server ça marche parfaitement.


    Ci-dessous, la question avec plus de détail :

    J'ai défini dans une base de données 2 tables Pays et Villes de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    T_Pays : 
    IdPays
    NomPays
     
    T_Villes : 
    IdPays
    IdVille
    NomVille
    J'ai défini une Foreign Key sur IdPays (relation 1N entre T_Pays et T_Villes).
    La contrainte fonctionne correctement dans SQL Server 2005.

    Dans mon projet ASP.Net je mappe mes tables dans un fichier Model.Edmx.
    Je souhaite donc ajouter une nouvelle Ville depuis mon code C# ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                        T_Villes VilleNonDefinie = new T_Villes();
                        VilleNonDefinie.IdPays = 1; // <-- ce Pays existe bien
                        VilleNonDefinie.NomVille = "Non défini";
                        BD = new GestionAssociationEntities();
                        BD.AddToT_Villes(localBD);
                        BD.SaveChanges();
    Mais j'obtiens l'erreur suivante :
    System.Data.UpdateException: Entities in 'GestionAssociationEntities.T_Villes' participate in the 'FK_T_Villes_T_Pays' relationship. 0 related 'T_Pays' were found. 1 'T_Pays' is expected.

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut
    J'ai finalement réussi à trouver la solution tout seul.
    Il ne faut pas redéfinir IdPays mais définir l'affectaction ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    VilleNonDefinie.T_Pays = pays;

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut
    Je réouvre la question car cette solution pose quelques problèmes de performence.

    Lorsque je créé une nouvelle Ville, je sélectionne dans une liste déroulante de Pays, je connais donc son IdPays.

    Avec la solution évoquée plus haut, je suis obligé de faire une requête en base pour récupérer l'objet Pays correspondant avant de faire la sauvegarde de la Ville...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Citation Envoyé par cfeltz Voir le message
    Je réouvre la question car cette solution pose quelques problèmes de performence.

    Lorsque je créé une nouvelle Ville, je sélectionne dans une liste déroulante de Pays, je connais donc son IdPays.

    Avec la solution évoquée plus haut, je suis obligé de faire une requête en base pour récupérer l'objet Pays correspondant avant de faire la sauvegarde de la Ville...
    En fait c'est pas un problème c'est une question de logique :

    Tu as un objet lié à un autre objet.
    Le mapping défini que la relation est définie par l'objet.
    Donc si tu as :

    Objet 1
    int prop1
    objet2 prop2

    Objet 2
    int prop1

    En outre, tu soulèves une autre question qui est l'état :
    Comment ton objet pourrais comprendre qu'il lui faut associer l'objet à l'autre et à quel moment ? Avec Quel contexte ? Quelle stratègie ?

    Ta contrainte fonctionne en SQL2005, oui, parce que relationnelle, là tu essayes de faire du SQL avec un modèle objet.

    Tu pourrais utiliser le modèle objet pour publier un événement, mais là encore : tu donnes un Id, soit, mais si tu donnes un id inexistant, un si tu ne veux pas attacher de pays ?

    Tu ne crois pas que le plus simple serait simplement de réflêchir objet plutôt que de penser SQL.
    Là tu raisonnes en "CRUD" SQL. Forcèmment ça coince.

    Si tu as un pays, c'est le pays qui contient les villes. Tu ne crois pas plus logique que la méthode d'ajout devrait se faire au niveau du pays (classe partielle) ?

    Sinon autre solution, tu arrêtes de générer du code n'importe comment, tu regardes tes mappings, tu supprimes le mapping associatif avec l'objet, tu laisses la propriété en int, et tu verras tout marcheras comme par magie.
    (SSDL et CSDL)

    La magie de l'ORM c'est aussi que tu puisses avoir de multiples entités persistentes et pas nécessairement du 1:1 avec une base de données...

    Tu pointes du doigt un problème qui est du au fait que tu n'as pas regardé les mappings générés.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut
    Merci pour cette réponse,
    Je comprend mieux et il est vrai que je raisonne beaucoup par rapport à SQL Server.

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

Discussions similaires

  1. [Mapping] Erreur d'ajout d'une ligne avec un Foreign key(Struts2, Hibernate)
    Par lahbabi dans le forum Hibernate
    Réponses: 0
    Dernier message: 11/08/2013, 06h45
  2. Réponses: 6
    Dernier message: 14/05/2009, 11h01
  3. Création d'une table avec foreign key.
    Par Paulinho dans le forum Débuter
    Réponses: 6
    Dernier message: 01/12/2005, 18h47
  4. problème avec Foreign Key [Interbase 7.5] [Delphi 2005]
    Par xenos dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/09/2005, 11h21
  5. Création d'une table avec foreign key
    Par lepierre dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/09/2004, 14h20

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