2011-02-04 24 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

正如我所說 - 雖然取決於您的應用程序。

相關問題