实体 Class 对象改变了它的值,尽管它没有改变
Entity Class object changing its value although its not changed
我有两个对象具有来自同一个查询的值
即(这不是 C# 代码,只是伪代码)
Class Obj = DbContext.Kid(K => K.Id == 2).FirstOrDefault();
Class Obj1 = DbContext.Kid(K => K.Id == 2).FirstOrDefault();
Id = 2 状态 = 1
现在如果我设置
Obj.Status = 2
;
在 C# 代码中
然后 Obj1
也将其状态从 1
更改为 2
为什么会这样?
您需要了解什么是 DBContext。
Check DBContext documentation here.
当您在同一个 DBContext 中工作时,它会跟踪您正在使用的实体。
因此,当您检索相同的实体并更改某些内容时,当您从相同的 DBContext 检索它时,它会描述更改,即使它在另一个 class 或当前应用程序中的服务中。
DBContext attach。查看 attach
的文档
Attaches the given entity to the context underlying the set. That is, the entity is placed into the context in the Unchanged state, just as if it had been read from the database.
稍后,当它从上下文中检索时,它将处于最后已知状态。
如果要刷新上下文中的项目,可以执行如下操作:
Obj.State = EntityState.Detached;
Class Obj1 = DbContext.Kid(K => K.Id == 2).FirstOrDefault();
请记住,Obj 将被分离,您将无法再对它执行会传播到数据库的操作。
这是因为这两个 "separate" 对象实际上是对同一对象的引用。
C#中的所有对象实际上都是指向内存中对象而不是真实对象的引用。
有关 c# 中引用和对象的更多信息:https://blog.robgarrett.com/2004/12/08/object-references-in-c/
entity framework 的优势之一是它足够聪明,可以意识到这两个对象是数据库中的同一个对象。因此,它不是在内存中存储对象的副本,而是 returns 对现有对象的引用。
如果您希望它们与对象不匹配,您可以使用 Entity Framework 中的 AsNoTracking()
。
参见:https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbextensions.asnotracking?view=entity-framework-5.0.0
您可以将其用作:
Object obj = Context.objs.Where(o => o.Id == 1).AsNoTracking().FirstOrDefault();
我有两个对象具有来自同一个查询的值
即(这不是 C# 代码,只是伪代码)
Class Obj = DbContext.Kid(K => K.Id == 2).FirstOrDefault();
Class Obj1 = DbContext.Kid(K => K.Id == 2).FirstOrDefault();
Id = 2 状态 = 1
现在如果我设置
Obj.Status = 2
;
在 C# 代码中
然后 Obj1
也将其状态从 1
更改为 2
为什么会这样?
您需要了解什么是 DBContext。
Check DBContext documentation here.
当您在同一个 DBContext 中工作时,它会跟踪您正在使用的实体。
因此,当您检索相同的实体并更改某些内容时,当您从相同的 DBContext 检索它时,它会描述更改,即使它在另一个 class 或当前应用程序中的服务中。
DBContext attach。查看 attach
的文档Attaches the given entity to the context underlying the set. That is, the entity is placed into the context in the Unchanged state, just as if it had been read from the database.
稍后,当它从上下文中检索时,它将处于最后已知状态。
如果要刷新上下文中的项目,可以执行如下操作:
Obj.State = EntityState.Detached;
Class Obj1 = DbContext.Kid(K => K.Id == 2).FirstOrDefault();
请记住,Obj 将被分离,您将无法再对它执行会传播到数据库的操作。
这是因为这两个 "separate" 对象实际上是对同一对象的引用。 C#中的所有对象实际上都是指向内存中对象而不是真实对象的引用。 有关 c# 中引用和对象的更多信息:https://blog.robgarrett.com/2004/12/08/object-references-in-c/
entity framework 的优势之一是它足够聪明,可以意识到这两个对象是数据库中的同一个对象。因此,它不是在内存中存储对象的副本,而是 returns 对现有对象的引用。
如果您希望它们与对象不匹配,您可以使用 Entity Framework 中的 AsNoTracking()
。
参见:https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbextensions.asnotracking?view=entity-framework-5.0.0
您可以将其用作:
Object obj = Context.objs.Where(o => o.Id == 1).AsNoTracking().FirstOrDefault();