2010-06-08 175 views
1

我正在嘗試在名爲AddOrUpdate的EF 4 POCO存儲庫上創建一個方法。EF 4,POCO和AddOrUpdate

這個想法是,業務層可以傳入一個POCO對象,並且持久性框架將添加該對象,如果它是新的(尚未在數據庫中),否則將更新數據庫(一旦調用SaveChanges()),與新的價值。這與我詢問EF有關的其他問題類似,但在理解這一點時我只有大約80%,所以請原諒部分重複。

我缺少的部分是如何確定業務對象確實已經存在於數據庫中,並且現在已經加載,如何在傳入的業務對象的ObjectContext /關聯ObjectSet中更新對象圖感謝TryGetObjectByKey)。 ApplyCurrentValues聽起來有點像我想要的,但它只複製標量值,似乎並不打算更新ObjectContext/ObjectSet中的對象圖。由於我的特殊用例,我現在不關心併發性。

public void AddOrUpdate(BO biz) 
{ 
    object obj; 

    EntityKey ek = Ctx.CreateEntityKey(mySetName, biz); 
    bool found = Ctx.TryGetObjectByKey(ek, out obj); 

    if (found) 
    { 
     // How do I do what this method name implies? Biz is a parent with children. 
     mySet.TellTheSetToUpdateThisObject(biz); 
    } 
    else 
    { 
     mySet.AddObject(biz); 
    } 

    Ctx.DetectChanges(); 
} 

回答

0

問題是我的業務對象使用new()運算符來分配子對象,而不是從ObjectContext構造對象。如果你不能使用new(),那麼不是真正的POCO行爲,但至少它在重構之後起作用。

0

你必須爲此編寫代碼。沒有內置任何內容複製整個圖表。正如你所說,ApplyCurrentValues將正常工作的標量值。你必須複製你自己的孩子。

+0

@Craig:因此,如果我通過EF 4加載了一個POCO父項(有可能是孫子等),修改一些子對象(修改現有子對象,添加新對象,刪除一些對象),我必須手動更新ObjectContext中的對象圖? – 2010-06-08 17:52:02

+0

否。如果從上下文加載並且實體執行某種形式的更改跟蹤,則這是自動的。只有當你從一個斷開的實體複製你自己的時候。 – 2010-06-08 18:12:56

+0

@Craig:我最初是從上下文加載的,但發現我的更改沒有應用到SaveChanges()的調用中。 POCO對象需要做什麼更改跟蹤?如果它必須實施更改跟蹤機制,它是否仍然是一個POCO對象? – 2010-06-08 18:59:38