我刚刚开始使用实体框架1.0,并相信我开始感受到每个人都在谈论的痛苦。我试图使用最佳实践,所以我有一组通过AutoMapper映射到我的实体的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;
}
然后我算了一下,也许我只是需要抓住从数据库中的实体第一,重视的背景下,调用地图的方法上映射,然后调用的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问题,因为它使用的视频实体的EntityKey属性。可爱。我设置了映射,以便当我从DTO映射到EF实体时,EntityKey属性将获得一个值。现在我需要一种方法来制定该映射规则的例外,但不知道从哪里开始。我想我可以在这个方法中创建一个全新的映射规则,并将EntityKey的VideoId属性设置为忽略,但这看起来很sl。。此外,我不确定此时创建的映射是否会停滞。如果它覆盖允许DTO将值映射到实体上的EntityKey的初始设置,那将会以完全不同的方式反弹。
任何人有更好的主意吗?
jfar:谢谢你的回应。首先,AFAIK AutoMapper是指什么?我在这里指的是AutoMapper:http://code.google.com/p/automapperhome/。关于PK Mapping,我正在讨论在一个地方定义所有的映射,而不是在整个代码中用.CreateMap语句抛出我的代码。这里的问题是我需要以不同的方式将我的DTO映射到我的实体,具体取决于我在数据库中创建新记录还是更新数据库中的记录。更多关于AutoMapper本身的第二个消息......用完字符...... – jason 2010-02-01 19:25:29
好的,您提到Automapper并非打算从DTO - > EF实体,而是打算成为EF - > DTO。如果是这样的话,当我的视图和控制器中使用的对象是DTO对象时,我应该如何通过EF对象更新数据库?我并不想要居高临下或什么。我只是想找出正确的方式来处理插入和更新,而不是将我的应用程序绑定到特定的数据访问实现。我愿意接受你可能提出的任何建议。 – jason 2010-02-01 19:40:49
AFAIK =据我所知,对不起没有更清楚 – jfar 2010-02-01 20:31:10