我最近才开始使用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;
}
现在我们遇到了可爱的 EF 问题,即不允许更改属性 VideoId,因为它由 Video 实体上的 EntityKey 属性使用。迷人的。我已经设置了映射,以便当我从 DTO 映射到 EF 实体时,EntityKey 属性将获得一个值。现在我需要一种方法来对该映射规则进行例外处理,但不知道从哪里开始。我想我可以在这个方法中创建一个全新的映射规则,并将 EntityKey 和 VideoId 属性设置为忽略,但这看起来相当草率。此外,我不确定此时创建的映射是否会保留。如果它覆盖了允许 DTO 将值映射到实体上的 EntityKey 的初始设置,则会以完全不同的方式适得其反。
有人有更好的主意吗?