2013-02-26 17 views
1

我在3層方案中將EntityFramework 4與自我跟蹤實體一起使用。
我的目標是在實體被保存回服務器時檢測ObjectContext的SavingChanges處理程序中的修改後的屬性。3層方案中的EntityFramework的ObjectStateEntry.GetModifiedProperties

需要注意的是:

  • 這是一個3層的情況;所以自我跟蹤的實體保存在另一個ObjectContext中,而不是從
  • 中獲取的實體,自調實體在調用SaveChanges之前已附加到上下文,並且所有更改均按預期保存。


這是我做跟蹤修改的屬性:

var objectStateManager = objectContext.ObjectStateManager; 
var modifiedObjectStateEntries = objectStateManager 
        .GetObjectStateEntries(EntityState.Modified) 
        .Where(x => !x.IsRelationship); 
foreach (var modifiedObjectStateEntry in modifiedObjectStateEntries) 
{ 
    // need to refresh from datasource, since this entity was fetched in another context 
    objectContext.Refresh(RefreshMode.ClientWins, modifiedObjectStateEntry.Entity); 
    var modifiedProperties = modifiedObjectStateEntry.GetModifiedProperties(); 
} 


現在,出於某種原因,該modifiedProperties集合包含的所有屬性,而不僅僅是 那些被修改的。任何想法爲什麼這是這種情況?

當我將OriginalValues與CurrentValues進行比較時,所有內容都與預期一致。

 
var originalValues = modifiedObjectStateEntry.OriginalValues; 
var currentValues = modifiedObjectStateEntry.CurrentValues; 
for (int i = 0; i < originalValues.FieldCount; i++) 
{ 
    // this works fine, only diffs are detected 
    if (!Equals(originalValues.GetValue(i), currentValues.GetValue(i))) 
    { 
    } 
} 


任何想法,爲什麼 「modifiedObjectStateEntry.GetModifiedProperties();」在這種情況下會不會像我預期的那樣工作?


感謝您的時間,
公園

+1

你爲什麼這樣做?當你不使用ApplyChanges時,使用自我跟蹤實體有什麼意義? – 2013-02-26 10:40:49

+0

我打電話給ApplyChanges。 我這樣做是爲了審計目的來跟蹤哪些屬性發生了變化。我不想依靠STE的ChangeTracker來做這種審計追蹤,因爲在這個應用程序中並不是所有事情都通過3層STE場景來保存。 – KoenJ 2013-02-26 22:33:11

+0

您能否顯示用於將實體附加到服務器端上下文的代碼? – dmusial 2013-03-01 11:09:01

回答

1

我能想到的唯一原因是,你對矯正所有屬性,因爲如果他們之後的改變,他們將只顯示來自該方法返回最後一次SaveChanges已發佈。

正如你可以看到MSDN它說: 返回自上次調用SaveChanges已更改的對象屬性的名稱叫

看看你的代碼示例,你看到這個的原因是因爲你正在刷新實體(這會設置每個屬性並將它們標記爲已修改)。

...  
objectContext.Refresh(RefreshMode.ClientWins, modifiedObjectStateEntry.Entity); 
... 

此調用將重置所有屬性,而不僅僅是被修改的屬性。

我不清楚你想要達到什麼目的,但是如果要查看哪些更新你不能這樣做。您將需要複製實體並刷新,然後才能檢查修改的字段,但這會很難看。