Entity Framework, AutoMapper, la manipulation de l'entité mises à jour

J'ai juste commencé à l'aide de Entity Framework 1.0 récemment et je crois que je suis commence à sentir les douleurs de tout le monde en parle. Je suis en train d'utiliser les meilleures pratiques donc, j'ai un ensemble de DTO obtenir mappé à partir de mes Entités via AutoMapper.

Le vrai catch, c'est quand je suis en train de mettre à jour un objet. Le premier piège est que je ne pouvais pas trouver un moyen de créer une nouvelle entité, transférer les données de mon DTO, et ont encore de l'entité ObjectContext rends compte qu'il a été modifié. 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;
        }

J'ai alors pensé que, peut-être que j'ai juste besoin de saisir l'entité de la base de données tout d'abord, fixez le contexte, l'appel de la méthode Map sur Mapper, puis appelez 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;
    }

Maintenant nous arrivons à la belle EF question de ne pas être autorisé à modifier la propriété, VideoId, car il est utilisé par le EntityKey bien sur la Vidéo de l'entité. Belle. J'ai eu de configuration des mappages de sorte que lorsque j'ai mappé à partir de mon DTO à une EF Entité, la EntityKey propriété serait d'obtenir une valeur. Maintenant j'ai besoin d'un moyen de faire une exception à la règle de mappage, mais n'avez aucune idée de par où commencer. Je suppose que je pourrais créer une nouvelle marque de Cartographie de la règle de droit dans cette méthode et de définir la EntityKey & VideoId propriétés pour être ignoré, mais qui semble assez bâclée. En outre, je ne suis pas sûr de cartographie créé à ce stade de bâton. Si elle l'emportait sur la configuration initiale qui a permis à la DTO de carte d'une valeur à la EntityKey sur l'entité, qui pourrait se retourner contre nous dans une toute autre manière.

Que quelqu'un a une meilleure idée?

OriginalL'auteur jason | 2010-01-29