实体框架,AutoMapper,处理实体更新

asp.net-mvc automapper c# entity-framework

我最近刚开始使用Entity Framework 1.0,并相信我开始感受到每个人都在谈论的痛苦。我正在尝试使用最佳实践,因此我有一组DTO通过AutoMapper映射到我的实体和从我的实体映射。

真正的问题是当我试图更新一个对象时。第一个问题是我找不到创建新实体的方法,从我的DTO传输数据,并且仍然让实体ObjectContext意识到它已被更改。我使用了以下代码:

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;
        }

然后我想,也许我需要先从数据库中获取实体,附加到上下文,在Mapper上调用Map方法,然后调用SaveChanges。我在这做了什么:

    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;
    }

现在我们得到了不允许更改属性VideoId的可爱EF问题,因为它被Video实体上的EntityKey属性使用。可爱。我已经设置了映射,以便当我从我的DTO映射到EF实体时,EntityKey属性将获得一个值。现在我需要一种方法来对该映射规则进行例外处理,但不知道从哪里开始。我想我可以在这个方法中创建一个全新的映射规则,并将EntityKey和VideoId属性设置为忽略,但这看起来非常草率。此外,我不确定此时创建的映射是否会成功。如果它覆盖允许DTO将值映射到实体上的EntityKey的初始设置,那将以完全不同的方式适得其反。

谁有更好的主意?

一般承认的答案

AutoMapper

你的第一个问题是,据我所知,AutoMapper的设计并非来自DTO-> Entity only Entity-> DTO。这可能最近有所改变,所以我不太确定。有关automapper旨在执行的操作的详细信息,请参阅此链接: 双向映射的情况

PK映射

你说:“在这个方法中映射规则,并设置EntityKey和VideoId属性被忽略,但这看起来很草率”

我认为这根本不是很邋。你真的不应该在持久化之后触摸EntityKey / PK,并且可能应该以某种方式编写其静态性。

实体框架

“现在我们得到了不允许更改属性VideoId的可爱的EF问题,因为它被视频实体上的EntityKey属性使用。很可爱。”

可爱? EF不会强迫您不更新PK。在生成的模型内部,您的密钥的setter内部会进行属性更改检查。解决方案是更改生成的代码。根据您的模型波动性,这可能不实用,但它是一种选择。


热门答案

尝试映射到现有对象:

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

并将Ignore()保持在原位。

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




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因