我想使用实体框架来保存域实体。我的项目的设置如下: -实体框架和存储库模式
- UI:MVC(使用Automapper域实体和视图模型之间的映射)
- 域名:entites的,服务,存储库接口
- 库:实体框架(实施来自域层的接口)。使用Automapper在域实体和实体框架对象之间进行映射。
这很好,除非在我的服务中,如果我通过检查存储库来验证项目,然后执行更新。这失败了,因为实体框架标识映射已经看过该项目,我尝试重新附加它。
我可以使用代码如下(这将是更加通用)
public void Update(Domain.Entities.Book entity)
{
Book newBook = _mapper.Map<Domain.Entities.Book, Book>(entity);
ObjectStateEntry cacheEntry;
if (_dataContext.ObjectStateManager.TryGetObjectStateEntry(_dataContext.CreateEntityKey("Books",newBook), out cacheEntry))
{
_dataContext.Books.ApplyCurrentValues(newBook);
}
else
{
_dataContext.Books.Attach(newBook);
_dataContext.ObjectStateManager.ChangeObjectState(newBook, EntityState.Modified);
}
_dataContext.SaveChanges();
}
的问题是,我觉得有写同一类的代码删除
public void Delete(Domain.Entities.Book entity)
{
Book newBook = _mapper.Map<Domain.Entities.Book, Book>(entity);
ObjectStateEntry cacheEntry;
if (_dataContext.ObjectStateManager.TryGetObjectStateEntry(_dataContext.CreateEntityKey("Books", newBook), out cacheEntry))
{
_dataContext.ObjectStateManager.ChangeObjectState(cacheEntry.Entity, EntityState.Deleted);
}
else
{
_dataContext.Books.Attach(newBook);
_dataContext.ObjectStateManager.ChangeObjectState(newBook, EntityState.Deleted);
}
_dataContext.SaveChanges();
}
我自己解决此问题
我确定必须有更好的方式来实现我想要做的事情,但是我不能为我的生活找出什么!
有关上述方法的任何其他一般性评论将被赞赏,因为我即将在大型项目中使用它!
感谢
罗斯
我想知道如何进入一个你不知道一个实体是否已经连接的情况。在像更新实体这样的基本用例中使用像TryGetObjectStateEntry这样的高级方法在我看来是代码味道。另外请注意,您的更新依赖于'cacheEntry.Entity'代表数据库中的原始状态,否则“ApplyCurrentValues”和更改跟踪将不会标记正确的属性被修改为执行正确的数据库更新。你是否知道,当你甚至不知道这个实体是否已经连接? – Slauma 2012-08-15 17:13:46
创建资源库对象并获取项目会导致项目被加载到EF中,然后转换为域项目。然后可以编辑该域项目,然后过去到存储库更新方法。然后这个域对象(使用AutoMap)变成一个分离的EF对象。由于密钥已被保存,因此将其附加到EF将导致异常。我很惊讶这对人们来说不是一个更大的问题? – 2012-08-15 17:17:53
我明白了。但是,为什么区分“域实体”和“EF实体”?没有中间映射,ORM是否能够坚持域实体? – Slauma 2012-08-15 17:44:14