2013-02-09 52 views
0
 TestEntities context = new TestEntities(); 

     var item = context.TestTables.Single(s => s.ID == 1);//item.Name is "Giorgi" 

     item.Name = "Hello"; 

     var item1 = context.TestTables.Single(s => s.ID == 1); 

     Console.WriteLine(item1.Name); 

     context.SaveChanges(); 

您期望寫什麼?你好寫! 爲什麼?重新選擇已更改但未在實體框架中保存的項目

 TestEntities context = new TestEntities(); 

     var item = context.TestTables.Single(s => s.ID == 1);//item.Name is "Giorgi" 

     item.Name = "Hello"; 

     var item1 = context.TestTables.Single(s => s.ID == 1); 

     context.SaveChanges(); 

     Console.WriteLine(item1.Name); 

你期望寫什麼?你好寫! 爲什麼? *
有兩個不同的問題
*

回答

2

您更改註冊的背景下,雖然沒有保存到數據庫中,直到你調用的SaveChanges。如果您需要原始值,則可以打開新的上下文,reload the entity或檢查更改跟蹤器以瞭解更改。

補充測試:

[Fact] 
public void TestUsingNewContext() 
{ 
    using (var context = new TestEntities()) 
    { 
     var item = context.TestTables.Single(s => s.ID == 1); 
     item.Name = "Hello"; 

     using (var newContext = new TestEntities()) 
     { 
      var item1 = newContext.TestTables.Single(s => s.ID == 1); 

      Assert.Equal("Giorgi", item1.Name); 
     } 
    } 
} 

[Fact] 
public void TestUsingReload() 
{ 
    using (var context = new TestEntities()) 
    { 
     var item = context.TestTables.Single(s => s.ID == 1); 
     item.Name = "Hello"; 

     context.Entry(item).Reload(); 

     var item1 = context.TestTables.Single(s => s.ID == 1); 

     Assert.Equal("Giorgi", item1.Name); 
    } 
} 

[Fact] 
public void TestUsingChangeTracker() 
{ 
    using (var context = new TestEntities()) 
    { 
     var item = context.TestTables.Single(s => s.ID == 1); 
     item.Name = "Hello"; 

     foreach (var entry in context.ChangeTracker.Entries<TestTable>().Where(e => e.State == EntityState.Modified)) 
     { 
      entry.CurrentValues.SetValues(entry.OriginalValues); 
     } 

     var item1 = context.TestTables.Single(s => s.ID == 1); 

     Assert.Equal("Giorgi", item1.Name); 
    } 
} 
0

在這兩種情況下,項目和項目1與背景相同的實體的聯繫。 EntityFramework存儲實體在你的上下文中。當您再次選擇它時,我將會返回緩存副本。當您更改上下文中的某個實體時,任何使用此上下文的人都會看到此更改。只有在comit之後,更改纔會轉到數據庫。

using(TestEntities context = new TestEntities()) 
{ 
     var item = context.TestTables.Single(s => s.ID == 1);//item.Name is "Giorgi" 

     item.Name = "Hello"; 

     using(TestEntities context = new TestEntities()) 
     { 
      var item1 = context.TestTables.Single(s => s.ID == 1); 
      Console.WriteLine(item1.Name); // you will get old value here 
     } 
} 

試着在msdn中閱讀它。因爲這裏的水下很多石頭。例如:如果有人在db中更改實體,並嘗試在之後提交更改,會怎麼樣?

http://msdn.microsoft.com/en-us/data/ee712907 http://msdn.microsoft.com/en-us/data/jj592904.aspx

+0

但有新的選擇應該採取從數據庫數據,並用它初始化對象 – levi 2013-02-09 21:40:15

0

的「上下文」住在內存中,所以當你在上下文中改變的東西,他們是不是在數據庫中更改,但他們在「上下文」改變(內存),只有當你調用context.SaveChanges()你實際上堅持你的更新/更改到數據庫。

爲什麼你需要的SaveChanges()如果不是實際保存更改..