Entity framework 实体框架核心如何在保存上下文之前处理实例?

Entity framework 实体框架核心如何在保存上下文之前处理实例?,entity-framework,asp.net-core,entity-framework-core,Entity Framework,Asp.net Core,Entity Framework Core,当出现以下情况时,实体框架如何工作: var myInstance = new MyObject(); // Do stuff _myContext.MyObjects.Add(myInstance); myInstance = null; _myContext.SaveChanges(); 我在一个复杂的foreach调用中遇到了这种情况,但它似乎仍然达到了预期的效果。但我很好奇它是如何处理它的,以及当实例为空时它是否放弃跟踪对象 我很好奇它如何处理它,以及当实例为空时它是否放弃跟踪

当出现以下情况时,实体框架如何工作:

var myInstance = new MyObject();

// Do stuff

_myContext.MyObjects.Add(myInstance);

myInstance = null;

_myContext.SaveChanges();
我在一个复杂的foreach调用中遇到了这种情况,但它似乎仍然达到了预期的效果。但我很好奇它是如何处理它的,以及当实例为空时它是否放弃跟踪对象

我很好奇它如何处理它,以及当实例为空时它是否放弃跟踪对象

在您的示例中,实例不是
null
——只有变量
myInstance
的值是
null
,即变量不包含对您创建的对象的引用

那么EF Core如何跟踪实例呢?在简化形式中,您可以将其视为
MyObjects
是一个
列表(当然实际实现是不同的)。那么,当你这样做时会发生什么:

var myObjects = new List<MyObject>();

var myInstance = new MyObject();

// Do stuff

myObjects.Add(myInstance);

myInstance = null;

同样,实际实现是不同的,但概念是相同的,
DbContext
实例包含某种类型的列表,其中包含所有“跟踪的”实体实例及其状态(
Added
Deleted
,等等)。

好的!我理解。让我好奇的是,循环中运行的列表给了我一个错误:“实体类型为'MyObject'的实例无法跟踪,因为另一个实例具有相同的键值…”,直到每个实例都被标记为null。然后它做了预期的事情。
var trackedInstance = myObjects[0];