假设我有一个 ITaskRepository 和一个 TaskEntityRepository,它实现 ITaskRepository 并包装对实体的 ObjectContext 的访问。
public interface ITaskRepository{
Task FindById(int taskId);
void Insert(Task task);
void Update(Task task);
}
我现在的问题是,当 FindById 返回实体时,我是否应该将实体与 ObjectContext 分离,并在调用 Update 方法时将其附加回来?
目前我没有从 ObjectContext 中分离实体,但是 Update 方法不包含任何功能(仅调用 SaveChanges())
最佳答案
这取决于您的应用程序。
如果您在无状态环境中工作(例如 ASP.NET Web Forms/MVC),则整个上下文始终是分离的(除非您使用自跟踪 POCO)。
因此,以 ASP.NET MVC Web 应用程序为例,当您想要更改现有实体时,您有两个选择:
- 再次获取实体(使用
FindById
),然后使用Controller.TryUpdateModel
合并更改,然后执行SaveChanges()
。在这种情况下,不需要您的Update
方法。您应该将其更改为简单的SaveChanges()
。 - 不要获取实体,而是使用
Update
方法将实体附加
到图表,然后手动进行更改。
2) POCO 很痛苦(相信我)。 ApplCurrentValues
仅适用于标量属性,因此如果您想要更新关系,则必须为每个关系手动设置 EntityState
。
我的建议 - 忘记分离实体,并完全失去您的 Update
方法。
正如我所说 - 取决于您的应用程序。
关于c# - 将存储库模式与 Entity Framework 结合使用时分离的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4896301/