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 :

Eviter doublons (INDEX)


Sujet :

Entity Framework

  1. #1
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut Eviter doublons (INDEX)
    Bonjour tout le monde,

    J'ai besoin de votre aide, je suis bloqué je ne sais plus comment m'y prendre.
    Je vais essayer de simplifier au maximum mon problème.

    J'ai les tables suivantes :

    Activite
    [activite_id] int
    [activite_nom] nvarchar(35)

    J'ai une contrainte d'index d'unicité sur activite_nom pour éviter les doublons.

    MembreCasting
    [mc_id]
    [mc_nom]
    [activite_id]

    Avec une cléf étrangère sur ACTIVITE (avec activite_id)

    Ce que je fais :

    - J'utilise en C# l'API allocine pour récupérer des informations sur les séries. Associée à chaque série il y a une liste de personnes (ma table MembreCasting). Ces personnes ont des roles différents (acteur, actrice, réalisateur etc... qui correspondent à ma table Activite)

    - J'ai crée des objets adapteurs (pour faire un mapping entre les objets allocine et les miens).

    Le problème que je rencontre :

    Comme vous vous en doutez je rencontre un problème avec l'index [activite_nom]. Mon objet Serie contient une liste de MembreCasting . Chaque MembreCasting contient Activite.

    Mon adapteur fonctionne trés bien pour remplir mon objet (qui contient d'autres objets) mais c'est lors du SaveChanges que EF me dit :

    Plusieurs entités ajoutées ont peut-être la même clé primaire.

    J'ai bien compris le problème qui est que chaque MembreCasting contient une Activite qui potentiellement à le même nom. Du coup ma contrainte d'unicité n'est pas contente mais comment faire ?

    J'ai essayé de récupérer l'activité si elle existe déjà pour qu'EF l'associe à une activité existante mais il ne l'a récupère jamais vu que le SaveChanges se fait tout à la fin.

    J'éspère que vous avez compris mon problème et que vous allez avoir le courage de lire jusque ici.

    Pour info : j'utilise Repository pattern et UnitOfWork.

    Merci d'avance,

    Vinceee38

  2. #2
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Je viens d'essayer quelque chose dans mon Adapter ACTIVITY :

    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
            public Activite ActivityToActivite(Activity activity)
            {
                if (activity != null)
                {
                    Activite activite = activiteBusiness.GetByNom(activity.Value);
                    if (activite == null)
                    {
                        activite = new Activite();
                        activite.activite_nom = activity.Value;
                        activiteBusiness.Add(activite);
                        activiteBusiness.SaveChanges();
                    }
                    return activite;
                }
                return null;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            public MembreCasting CastMemberToMembreCasting(CastMember castMember)
            {
                if (castMember != null)
                {
                    MembreCasting membreCasting =  new MembreCasting();
                    membreCasting.mc_nom = castMember.Role;
                    membreCasting.Activite = activityAdapter.ActivityToActivite(castMember.Activity);
                    membreCasting.Personne = personneAdapter.PersonLightToPersonne(castMember.Person);
                    return membreCasting;
                }
                return null;
            }
    Il récupère bien les activités s'il elles existent déjà maintenant mais lors du SaveChanges de mon objet Serie j'ai une nouvelle erreur :

    Un objet ayant la même clé existe déjà dans ObjectStateManager. L'objet existant est dans l'état Unchanged. Un objet ne peut être ajouté de nouveau à ObjectStateManager que s'il est dans l'état ajouté.

  3. #3
    Membre du Club Avatar de Vinceee38
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 65
    Points
    65
    Par défaut
    Bonjour à tous,

    Je reviens pour vous dire que j'ai résolu mon problème.

    En fait il faut bien penser pour chaque objet contenu dans l'objet principal à faire un .Add (pour ceux qui sont nouveaux) et à simplement affecter ceux qui existent déjà à l'objet principal.

    Enfin il faut utiliser le SaveChanges sur l'objet principal.

    Exemple (code pondu à la volée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Produit produit = new Produit ();
    produit.Article = AjouterOuRecupererSiExistene("Carotte");
    SaveChanges();
     
    public Article AjouterOuRecupererSiExistene(string nomArticle){
         //Si existe on retourne l'objet
         //Sinon on le créer et on appel .Add(article)
    }
    Voila je ne sais pas si c'est ce qu'il y a de mieux à faire mais comme je n'ai pas de réponse et que ca fonctionne je pars la dessus.

    Bonne journée à tous et merci à ceux qui ont lu mon post

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

Discussions similaires

  1. Eviter doublons avec un TCD
    Par akira66fr dans le forum Excel
    Réponses: 3
    Dernier message: 13/03/2008, 18h02
  2. Eviter Doublons ?
    Par architecte dans le forum Requêtes
    Réponses: 10
    Dernier message: 12/03/2008, 09h12
  3. Eviter doublon dans une liste déroulante
    Par Joachim49 dans le forum Excel
    Réponses: 4
    Dernier message: 21/05/2007, 12h07
  4. Eviter doublon dans Requete Access 2000
    Par Soulama dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/02/2007, 10h13
  5. [SQL] Eviter doublons dans un select (sans DISTINCT)
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 40
    Dernier message: 11/07/2006, 17h07

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