2011-07-21 23 views
1
  1. 當我獲取對象從數據庫(有代理POCO對象)
  2. 我修改它的屬性不會保存更改
  3. 我再次把它拿來以後從數據庫(我使用相同的對象上下文)
  4. 屬性的值是什麼?

例如,如果我有收集用戶對象上下文那麼什麼是下面的結果:是否ObjectContext的跟蹤已經獲取的實體重新獲取他們

ObjectContext o = ....; 
User u = o.Users.First(u=>u.Id == 1); 
Console.WriteLine(u.LastName); // I get 'test' for example 
u.LastName = 'SomethingElse'; 
u = o.Users.First(u=>u.Id == 1); 
Console.WriteLine(u.LastName); // What is the result?? 

如果最後一條語句的結果不是字符串「SomethingElse」那麼有沒有一個如何實現這種功能?

回答

1

這是ORM工具的核心功能,名爲identity map pattern。具有唯一鍵的實體只能在每個上下文中實現一次,因此第二個查詢將默認使用同一個實例而不更改其值。

您可以強制查詢或者通過刷新值:

ObjectContext o = ....; 
User u = o.Users.First(u=>u.Id == 1); 
Console.WriteLine(u.LastName); // I get 'test' for example 
u.LastName = 'SomethingElse'; 
o.Users.MergeOption = MergeOption.OverwriteChagnes; // Here you change the behavior 
u = o.Users.First(u=>u.Id == 1); 
Console.WriteLine(u.LastName); // result is 'test' again 

或重裝實體本身:

ObjectContext o = ....; 
User u = o.Users.First(u=>u.Id == 1); 
Console.WriteLine(u.LastName); // I get 'test' for example 
u.LastName = 'SomethingElse'; 
o.Refresh(RefreshMode.StoreWins, u); // Here you reload entity with values from the database 
Console.WriteLine(u.LastName); // result is 'test' again  
0

是的,有一個身份管理器返回相同對象如果看到相同的記錄標識來從數據庫返回的。

因此,結果應該是"SomethingElse",除非您禁用身份管理器。

+0

或使用'Detach' ...(這我不得不做,特別是在POST後,當我需要一個觸發器生成的slu)) – RPM1984

相關問題