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 つの異なる質問があります
*

4

3 に答える 3

2

変更はコンテキストに登録されますが、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);
    }
}
于 2013-02-09T21:44:00.483 に答える
0

どちらの場合も、 item と item1 はコンテキスト内の同じエンティティにリンクされています。EntityFramework は、エンティティをコンテキストに格納します。もう一度選択すると、キャッシュされたコピーが返されると思います。コンテキスト内のエンティティを変更すると、このコンテキストで作業する人は誰でもこの変更を確認できます。変更は、コミット後にのみデータベースに送信されます。

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

于 2013-02-09T21:38:37.933 に答える
0

「コンテキスト」はメモリ内に存在するため、コンテキスト内のものを変更してもデータベース内では変更されませんが、「コンテキスト」(メモリ)内で変更されます。 context.SaveChanges() を呼び出した場合にのみ、実際に更新を永続化します/データベースへの変更。

実際に変更を保存しない場合、なぜ SaveChanges() が必要なのですか..

于 2013-02-09T21:48:19.580 に答える