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

本文关键字:项目 保存 选择 框架 实体 新选择 | 更新日期: 2023-09-27 17:58:34

        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);

你希望写什么?你好是写的为什么*
有两个不同的问题
*

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

您的更改会在上下文中注册,尽管在调用SaveChanges之前不会保存到数据库中。如果您需要原始值,您可以打开一个新的上下文、重新加载实体或检查更改跟踪器中的更改。

增加测试:

[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);
    }
}

"context"存在于内存中,因此当您在context中更改内容时,它们不会在数据库中更改,而是在"context(内存(中更改,只有当您调用context时。SaveChanges((实际上是将更新/更改持久化到数据库中。

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

在这两种情况下,item和item1都在上下文中链接到同一实体。EntityFramework为您在上下文中存储实体。我怀疑当你再次选择它时,它会返回缓存副本。当您更改上下文中的某个实体时,任何使用此上下文的人都会看到此更改。只有在commit之后,更改才会进入数据库。

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中阅读它。这里水下有很多石头。例如:如果有人在数据库中更改了你的实体,而你在之后试图提交你的更改,会发生什么?

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