我最近才开始使用 Entity Framework 1.0,相信我开始感受到每个人都在谈论的痛苦。我正在尝试使用最佳实践,因此我有一组通过 AutoMapper 映射到我的实体和从我的实体映射的 DTO。
真正的问题是当我试图更新一个对象时。第一个问题是我找不到创建新实体的方法,从我的 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 的初始设置,那将以完全不同的方式适得其反。
有人有更好的主意吗?