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 :

[EF4] Problème lors de l'insertion d'un objet ayant des dépendances


Sujet :

Entity Framework

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    794
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 794
    Points : 987
    Points
    987
    Par défaut [EF4] Problème lors de l'insertion d'un objet ayant des dépendances
    Bonsoir,

    Je suis face à un problème auquel je ne trouve pas de solution j'ai un objet Poco nommé Publication qui contient deux propriétés UserSet (objet FK User) qui lui même possède une propriété RoleSet (object FK Role).

    Dans mon application MVC ma vue est Bindé au type Publication, puis dans mon action je fais appel à mon repository UserRepository afin de récupérer l'instance de User qui va bien.

    Typiquement je fais cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using(var repository = new UserRepository())
    {
    model.UserSet = repository.FindByUserName(HttpContext.User.Identity.Name);
    }

    Jusque là c'est Ok mon objet User ainsi que le sous objet Role sont récupérés correctement .

    Seulement j'ai un bug lorsque je veux enregistrer mon instance de Publication en faisant cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using(var repository = new PublicationRepository())
    {
    repository.Add(model);
    }
    En fait EF pense que l'objet User est un nouvel enregistrement et tente donc de l'ajouter en base, seulement le username étant unique j'ai une exception provenant d'SQL Server à ce sujet.

    Ma question est donc comment faire pour qu'EF comprenne que User n'est pas un nouvel objet ?

    NB : J'ai tenté une méthode sauvage en mettant l'ensemble des repository dans un même contexte grace à cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            public R RepositoryFromContext<R>() where R : IRepositoryBase
            {
                return (R)Activator.CreateInstance(typeof(R), new object[] { this.OperationContext });
            }
    La par contre j'ai une erreur comme quoi que l'entity est référencée par plusieurs entity tracker.


    Cordialement

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    794
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 794
    Points : 987
    Points
    987
    Par défaut
    J'ai trouvé une solution pouvez vous me donner vos avis :

    J'ai ajouté une méthode Detach à mon repository de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userRepository.FindByUserName(HttpContext.User.Identity.Name, true);
    True signifie détache moi l'objet

    Puis j'attache l'objet au repository qui m'interesse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    repository.Attach<User>(user);
    Et là sa fonctionne.


    Voici le code complet :


    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
    User user = null;
                    PublicationGroup group = null;
     
                    using (var repository = new PublicationRepository())
                    {
                        using (var userRepository = repository.RepositoryFromContext<UserRepository>())
                        {
                            user = userRepository.FindByUserName(HttpContext.User.Identity.Name, true);
                            repository.Attach<User>(user);
                        }
     
                        using (var groupRepository = repository.RepositoryFromContext<PublicationGroupRepository>())
                        {
                            group = groupRepository.FindById<int>(model.publicationGroupId, true);
                            repository.Attach<PublicationGroup>(group);
                        }
     
                        publication.UserSet = user; // Utilisateur courant
                        publication.PublicationGroupSet = group;
     
                        repository.Add(publication);
                    }

    Qu'en pensez vous ?

    Cordialement.

  3. #3
    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
    Cela viens du fait que vous utilisez deux DataContext différent pour votre mise à jour: un chargeant l'objet User l'autre pour faire l'INSERT/UPDATE.

    Le deuxième ne connais pas le User car ce n'est pas lui qu'il l'à chargé (d'où le nom de contexte...).

    Les méthodes Attach/detach ont été crées à cet effet mais vous pouvez également avoir une approche ne faisant appel qu'à un seul datacontext...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Cela viens du fait que vous utilisez deux DataContext différent pour votre mise à jour: un chargeant l'objet User l'autre pour faire l'INSERT/UPDATE.

    Le deuxième ne connais pas le User car ce n'est pas lui qu'il l'à chargé (d'où le nom de contexte...).

    Les méthodes Attach/detach ont été crées à cet effet mais vous pouvez également avoir une approche ne faisant appel qu'à un seul datacontext...
    +1
    De plus je ne vois pas l’intérêt d'avoir deux contextes avec des schémas et données identiques.

Discussions similaires

  1. Problème lors de l'insertion de données
    Par galoi81 dans le forum Oracle
    Réponses: 14
    Dernier message: 30/07/2007, 16h10
  2. [PDO] Problème lors d'un INSERT ou un DELETE
    Par WerKa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/06/2007, 15h19
  3. [VB 2005][SQL SERVER]Problème lors de l'insert
    Par LauBelette dans le forum Accès aux données
    Réponses: 4
    Dernier message: 26/12/2006, 03h59
  4. Réponses: 3
    Dernier message: 26/04/2006, 08h16
  5. [JDesktopPane] Problème lors de l'insertion d'une JInternalFrame
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 21/09/2005, 01h38

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