2013-02-09 50 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()如果不是实际保存更改..