我想使用实体框架来持久化域实体。我的项目设置如下:-
- UI:MVC(使用 Automapper 在域实体和视图模型之间进行映射)
- 领域:实体、服务、存储库接口
- 存储库:实体框架(实现领域层的接口)。使用 Automapper 在域实体和实体框架对象之间进行映射。
这很好用,除非在我的服务中,如果我通过检查存储库来验证项目,然后执行更新。这失败了,因为 Entity Frameworks 身份映射之前已经看到过该项目,我尝试再次附加它。
我可以使用如下代码解决这个问题(这将变得更通用)
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();
}
我确信一定有更好的方法来实现我想要做的事情,但我无法为我的生活弄清楚什么!
对于上述方法的任何其他一般性评论将不胜感激,因为我即将在大型项目中使用它!
谢谢
罗斯