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