C# 在实体框架中重新选择已更改但未保存的项

C# 在实体框架中重新选择已更改但未保存的项,c#,.net,entity-framework,.net-4.5,C#,.net,Entity Framework,.net 4.5,你希望写什么?你好,是我写的为什么? 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 =

你希望写什么?你好,是我写的为什么?

        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();
你希望写什么?你好,是我写的为什么?
*
在这两种情况下,item和item1都有两个不同的问题*

在上下文中与同一实体链接。EntityFramework在上下文中为您存储实体。再次选择时,它将返回缓存副本。当您在上下文中更改某个实体时,使用此上下文的任何人都会看到此更改。只有在comit之后更改才会进入数据库

        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);
请尝试在msdn中阅读。因为这里水下有很多石头。例如:如果有人在数据库中更改了您的实体,而您在更改后尝试提交更改,会怎么样


您的更改将在上下文中注册,但在调用SaveChanges之前不会保存到数据库中。如果需要原始值,可以打开新的上下文,或者检查更改跟踪器中的更改

新增测试:

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
       }
}
[事实]
使用NewContext()的公共无效测试
{
使用(var context=newtestentities())
{
var item=context.TestTables.Single(s=>s.ID==1);
item.Name=“你好”;
使用(var newContext=newtestentities())
{
var item1=newContext.TestTables.Single(s=>s.ID==1);
Assert.Equal(“Giorgi”,item1.Name);
}
}
}
[事实]
使用重新加载()的公共无效测试
{
使用(var context=newtestentities())
{
var item=context.TestTables.Single(s=>s.ID==1);
item.Name=“你好”;
context.Entry(item.Reload();
var item1=context.TestTables.Single(s=>s.ID==1);
Assert.Equal(“Giorgi”,item1.Name);
}
}
[事实]
使用ChangeTracker()的公共无效测试
{
使用(var context=newtestentities())
{
var item=context.TestTables.Single(s=>s.ID==1);
item.Name=“你好”;
foreach(context.ChangeTracker.Entries()中的var条目,其中(e=>e.State==EntityState.Modified))
{
entry.CurrentValues.SetValues(entry.OriginalValues);
}
var item1=context.TestTables.Single(s=>s.ID==1);
Assert.Equal(“Giorgi”,item1.Name);
}
}
由于“上下文”存在于内存中,因此当您在上下文中更改内容时,它们不会在数据库中更改,而是在“上下文”(内存)中更改,只有在调用context.SaveChanges()时,您才能将更新/更改持久化到数据库中


如果不实际保存更改,为什么需要SaveChanges()。

但是有一个新的select,它应该从数据库中获取数据并用它初始化对象
[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);
    }
}