Entity Framework, AutoMapper, gestion des mises à jour d'entités

asp.net-mvc automapper c# entity-framework

Question

Je viens tout juste de commencer à utiliser Entity Framework 1.0 récemment et je pense que je commence à ressentir les douleurs dont tout le monde parle. J'essaie d'utiliser les meilleures pratiques afin d'avoir un ensemble de DTO mappés vers et à partir de mes entités via AutoMapper.

Le vrai problème, c'est quand j'essaye de mettre à jour un objet. La première chose à faire était que je ne pouvais pas trouver un moyen de créer une nouvelle entité, de transférer les données de mon DTO et de laisser l'entité ObjectContext se rendre compte qu'elle avait été modifiée. J'ai utilisé le code suivant:

public VideoDTO UpdateVideo(VideoDTO pVideo)
        {
            Video video = new Video();
            Mapper.Map(pVideo, video);
            context.Attach(video); //Successfully attaches
            context.ApplyPropertyChanges("Videos", video);  // no changes made as far as entity knows b/c it was attached in it's updated state
            context.SaveChanges(); //doesn't save the entity                
            return pVideo;
        }

Je me suis alors dit que je devais peut-être d'abord saisir l'entité de la base de données, l'attacher au contexte, appeler la méthode Map sur Mapper, puis appeler SaveChanges. Voici ce que j'ai fait:

    public VideoDTO UpdateVideo(VideoDTO pVideo)
    {
        Video video = context.Videos.Where(v => v.VideoId == pVideo.VideoId).FirstOrDefault();
        Mapper.Map(pVideo, video); //Error here: Can't change VideoId value on Video entity
        //context.Attach(video);
        //context.ApplyPropertyChanges("Videos", video);
        context.SaveChanges();

        return pVideo;
    }

Nous en arrivons maintenant au beau problème de l’EF qui consiste à ne pas être autorisé à modifier la propriété VideoId car elle est utilisée par la propriété EntityKey sur l’entité Video. Charmant. J'avais configuré les mappages pour que, lorsque je mappais de mon DTO vers une entité EF, la propriété EntityKey obtienne une valeur. Maintenant, j'ai besoin d'un moyen de créer une exception à cette règle de mappage, mais je ne sais pas par où commencer. Je suppose que je pourrais créer une nouvelle règle de mappage directement dans cette méthode et définir les propriétés EntityKey & VideoId pour qu'elles soient ignorées, mais cela semble plutôt négligé. De plus, je ne suis pas sûr qu'un mappage créé à ce stade colle. Si elle annulait la configuration initiale qui permettait au DTO de mapper une valeur à EntityKey sur l'entité, cela se retournerait d'une manière totalement différente.

Quelqu'un a une meilleure idée?

Réponse acceptée

AutoMapper

Votre premier problème est que pour autant que je sache, AutoMapper n'est pas conçu pour aller de DTO-> Entité uniquement Entité-> DTO. Cela aurait pu changer récemment, donc je ne suis pas vraiment sûr. Voir ce lien pour plus d’informations sur ce que l’automapper est conçu pour faire: Le cas du mappage bidirectionnel

Cartographie de PK

Vous dites: "La règle de mappage directement dans cette méthode et définir les propriétés EntityKey & VideoId pour être ignorées, mais cela semble assez bâclé"

Je ne pense pas que ce soit bâclé du tout. Vous ne devriez vraiment pas toucher une clé EntityKey / PK après la persistance de celle-ci et probablement codifier son caractère statique.

Cadre d'entité

"Nous en arrivons maintenant au beau problème d'EF, à savoir qu'il n'est pas autorisé à modifier la propriété, VideoId, car elle est utilisée par la propriété EntityKey sur l'entité Video. Lovely."

Charmant? EF ne vous oblige pas à ne pas mettre à jour votre PC. Dans les modèles générés, il existe un contrôle de modification de propriété à l'intérieur du sélecteur pour vos clés. La solution serait de changer le code généré. En fonction de la volatilité de votre modèle, cela peut ne pas être pratique, mais c'est une option.


Réponse populaire

Essayez de mapper sur un objet existant:

entity = Mapper.Map<MyDTO, NyEntity>(dto, entity); 

Et maintenez les Ignore () en place.

http://groups.google.com/group/automapper-users/browse_thread/thread/24a90f22323a27bc?fwc=1&pli=1



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow