使用具有实体框架的存储库模式时分离实体

时间:2011-02-04 09:15:51

标签: c# entity-framework-4 entity repository-pattern

假设我有一个ITaskRepository和一个TaskEntityRepository来实现ITaskRepository并包含对Entity的ObjectContext的访问。

public interface ITaskRepository{
  Task FindById(int taskId);
  void Insert(Task task);
  void Update(Task task);
}

现在我的问题是,当FindById返回实体时,我应该从ObjectContext中分离实体,并在调用方法Update时将其附加回来吗?

目前我没有从ObjectContext中分离实体,但是Update-method不包含任何功能(只调用SaveChanges())

2 个答案:

答案 0 :(得分:4)

这取决于您的申请。

如果您在无状态环境(例如ASP.NET Web Forms / MVC)中工作,则整个上下文始终是分离的(除非您使用自我跟踪POCO)。

因此,以ASP.NET MVC Web应用程序为例,当您想要对现有实体进行更改时,您有两个选项:

  1. 再次获取实体(使用FindById),然后使用Controller.TryUpdateModel合并更改,然后执行SaveChanges()。在这种情况下,您不需要Update方法。您应该将其更改为SaveChanges()
  2. 不要获取实体,而是使用Update方法将Attach实体添加到图表中,然后手动进行更改。
  3. 2)POCO的痛苦(相信我)。 ApplCurrentValues仅适用于标量属性,因此如果您想更新关系资源,则必须为每个关系手动设置EntityState

    我的建议 - 忘记分离实体,完全丢失Update方法。

    正如我所说 - 取决于你的申请。

答案 1 :(得分:0)

如果先进行数据库设计并从数据库创建实体,则无法将实体与ObjectContext分开。但是,您可以选择代码第一个POCO模型,然后单独创建DbContext,然后您应该能够将实体与基础上下文分开。

http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5-release.aspx