我正在使用“存根技术”来更新我的 POCO(在分离的上下文中使用,ASP.NET MVC)。
这是我目前在我的控制器中的代码(有效):
[HttpPost]
public ActionResult Edit(Review review)
{
Review originalReview = _userContentService.FindById(review.PostId) as Review;
var ctx = _unitOfWork as MySqlServerObjectContext;
ctx.ApplyCurrentValues("MyEntities.Posts", review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
如您所见,到处都有代码气味。:)
几点:
- 我基本上对所有东西都使用依赖注入(基于接口)
- 我使用工作单元模式来抽象 ObjectContext 并提供跨多个存储库的持久性
- 目前我的IUnitOfWork接口只有 1 种方法:
void Commit();
- 控制器有
IUserContentService
DIIUnitOfWork
注入 IUserContentService
调用Find
存储库,它使用ObjectContext
.
这是我不喜欢上面的代码的两件事:
- 我不想将IUnitOfWork 转换为
MySqlServerObjectContext
. - 我不希望控制器必须关心
ApplyCurrentValues
我基本上希望我的代码看起来像这样:
[HttpPost]
public ActionResult Edit(Review review)
{
_userContentService.Update(review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
有什么想法我该怎么做?(或类似的东西)。
我已经很聪明地根据类型(泛型的组合、复数形式)计算出实体集的名称,所以不要太担心。
但我想知道最好的放置位置在ApplyCurrentValues
哪里?将它放在接口中似乎不合适IUnitOfWork
,因为这是一个持久性 (EF) 问题。出于同样的原因,它不属于服务。如果我把它放在我的MySqlServerObjectContext
类中(有道理),我会从哪里调用它,因为没有任何东西可以直接访问这个类 - 当有东西请求时它是通过 DI 注入的IUnitOfWork
。
有什么想法吗?
编辑
我有一个使用存根技术的解决方案,但问题是如果我事先检索了我正在更新的实体,它会引发异常,说明具有该键的实体已经存在。
这是有道理的,虽然我不确定如何解决这个问题?
我是否需要“检查实体是否已附加,如果没有,请附加它?”
任何 EF4 专家都可以提供帮助吗?
编辑
没关系 - 找到了解决方案,请参阅下面的答案。