2011-02-04 82 views
2

假设我有一个ITaskRepository和一个TaskEntityRepository,它实现ITaskRepository并包装对Entity的ObjectContext的访问。使用RepositoryPattern与EntityFramework时分离实体

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

我的问题是我现在应该分离从ObjectContext的实体时,它就会通过FindById退回,并附上回在方法调用Update?

目前我不分离从ObjectContext的实体,但随后的更新,方法不包含任何功能(只调用的SaveChanges())

+1

如果您在有状态环境中工作(winforms,wpf,单个请求处理),应该没有理由分离实体。如果您正在无状态环境(asp.net,asp.net mvc,multile相关请求处理)中工作,请遵循@RPM建议。很难帮助你更好,因为你的问题缺少像以下这样的信息:你正在构建什么类型的应用程序?您是否使用POCO,STE或重EF实体?哟如何处理ObjectContext?等等。 – 2011-02-04 10:15:11

+0

@Ladislav Mrnka:抱歉失踪的作品。稍后我会添加更多信息。它的Siverlight 4/WCF RIA服务/ EF 4应用程序没有poco – Jehof 2011-02-04 11:14:33

回答

4

这取决于您的应用程序。

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

所以,服用ASP.NET MVC Web应用程序的例子,你有两个选择,当你想改变现有的实体:

  1. 再去获得实体(使用FindById) ,然后使用Controller.TryUpdateModel在更改中合并,然后执行SaveChanges()。在这种情况下,您的Update方法不是必需的。您应该将其更改为SaveChanges()
  2. 不要获得实体,而是使用您的Update方法将Attach实体添加到图中,并手动进行更改。

2)POCO的痛苦(相信我)。 ApplCurrentValues仅适用于标量属性,因此如果要更新关系数据库,则必须为每个关系手动设置EntityState

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

正如我所说 - 虽然取决于您的应用程序。

相关问题