2012-04-10 9 views
-1

我正在使用ObservableCollection<T>將某些數據綁定到某個視圖。 在編輯數據庫現有數據時,我可以通過在我的視圖模型中只調用一個Savechanges()方法來保存數據編輯,還可以將新項目添加到集合中,並且可以編輯它們,但SaveChanges()方法不會將其他行插入到D b。在代碼優先的情況下跟蹤DbContext與ObservableCollection的更改

我不知道傳遞給viewmodel的實體是什麼。 T是多個實體的合併類,所以我必須這樣做。 在構造函數:

collection=globalContext.TSet; 
//the collection and context are defined in class level 

代碼來獲得一個新項目:

collection.Add(New T()); 
CurrentItem=collection.Last(); 

其中collection是ObservableCollection<T>CurrentItem是當前正在編輯的項目。

編輯:context.ChangeTracker.Entries不能識別新的對象。

我有一個複雜的類型(比如T),它是一些連接查詢的結果,我不知道T是從哪個實體創建的,所以我無法獲取實體=>我不能說上下文是什麼我想要添加的實體類型。

所以我必須強制更改跟蹤器從複雜類型創建新對象,這是一些連接查詢的結果。

我正在使用EF4.3.1

有什麼建議嗎?

謝謝。

+0

你可以在T的構造函數中添加新的組合對象的部件到相應的Dbsets嗎?然後他們會被追蹤,並保存上下文的變化應該工作。但我不是100%確定,如果我明白這個問題是正確的... – Sascha 2012-04-14 08:32:40

+0

@Sascha:新的T添加到集合中,當我在視圖模型中設置新的T屬性時,我可以看到屬性設置視圖模型和該集合包含新的T,但它們在調用savechanges();之後不會影響db(謝謝) – Mohsen 2012-04-14 08:58:00

+0

但是ObservableCollection並不知道DbSet或上下文中的任何內容。它應該如何猜測其他邏輯應該應用於剛添加到自身的對象? – Sascha 2012-04-14 09:00:22

回答

0

數據庫沒有得到更新。通過IDbSet修改視圖(或視圖模型)中的DBSets,然後發出DbContext.SaveChanges執行此操作而不是直接修改ObservableCollection。然後ObservableCollection應該刷新自己並更新視圖模型和視圖。如果它不重新生成數據庫以生成新的DbSet,則從視圖模型的DbSet.Local中獲取一個新的ObservableCollection,然後從中創建一個新視圖。

+0

剛剛添加了一些信息。 – Mohsen 2012-04-18 07:08:16

0

您尚未將新實體添加到TSet。您需要調用TSet.Add(t)或掛接ObservableCollection的CollectionChanged事件以自動完成。