C# 附加后未经批准的进入状态

C# 附加后未经批准的进入状态,c#,.net,entity-framework,entity-framework-core,C#,.net,Entity Framework,Entity Framework Core,我正在玩添加/附加和斗争的东西 如果在示例2中的最后一行中,我获得了对实体Entryentry4的引用,则每个entry实例中的状态都会更改。但是,如果在案例1中没有条目4,则每个条目中的状态都不会更改 案例1注释了行 案例2未对该行进行注释 也 版本:.Net Core 3.1、Microsoft.EntityFrameworkCore.SqlServer 3.1.1 所以我不明白获取引用如何改变状态。即使是臭虫,也是非常非常奇怪的臭虫。通过getter可以改变某些内容 多谢各位 在对象上运行

我正在玩添加/附加和斗争的东西

如果在示例2中的最后一行中,我获得了对实体Entryentry4的引用,则每个entry实例中的状态都会更改。但是,如果在案例1中没有条目4,则每个条目中的状态都不会更改

案例1注释了行

案例2未对该行进行注释

版本:.Net Core 3.1、Microsoft.EntityFrameworkCore.SqlServer 3.1.1

所以我不明白获取引用如何改变状态。即使是臭虫,也是非常非常奇怪的臭虫。通过getter可以改变某些内容


多谢各位

在对象上运行更改跟踪之前,现有EntityEntry对象的状态不会更改。这本书是一本POCO,所以没有神奇的方法让变化追踪者知道你已经改变了书名

获取书本的新EntityEntry会检测到更改,并使其在所有其他EntityEntry上可见。或运行:

book.Title = "The witcher 1";
context.ChangeTracker.DetectChanges();

将用正确的状态更新现有EntityEntry对象。

我认为book已被跟踪,因此在您对源进行修改并尝试附加它之后,它将看到差异并将条目标记为已修改。另外,entry1.Entity==entry2.Entity==entry3.Entity==entry4.Entity.谢谢您的评论。我这本书没有被追踪。我不完全理解你。但是,是的,实体实例是相同的,但引用不同。我说入口实例entry1,entry2。。。是不同的实例。正在工作。谢谢你!在第一次接触EF时似乎有点奇怪。因此,当调用SaveChanges时,它将在内部调用DetectChanges。它保持对已创建条目InstanceEntry1、entry2的引用。。我想是更新了。此更新是最棘手的部分。
// var entry4 = context.Entry(book); 
// -> NOTHING changed: entry1.State, entry2.State, entry3.State equal to Unchanged
var entry4 = context.Entry(book); 
// -> EVERYTHING changed: entry1.State, entry2.State, entry3.State equal to Modified
entry1!=entry2!=entry3!=entry4
book.Title = "The witcher 1";
context.ChangeTracker.DetectChanges();