尝试在 EF 4.0 中保存实体时出现奇怪的行为。
只需考虑一个具有一个字符串属性的简单复杂类型。然后我有一个实体 POCO-Class(实际上是一个 STE,但这不是这里的重点),它包含这种复杂类型的几个复杂属性。
然后可以使用以下代码显示行为:
var object = context.Records.Where(p => p.ID = requestedID).First(); // works
object.ComplexProp1 = new ComplexTypeA(...);
context.DetectChanges(); // success
context.DetectChanges(); // NullReferenceException
这段代码只是为了显示错误。它实际上是在我调用 SaveChanges() 时发生的,它在内部调用 DetectChanges(),所以我使用这段代码来重现。经过大量调试 EF 代码后,我发现在 EntityEntry.FindOriginalValue() 方法内部,第二次没有找到原始值,这导致其他地方出现异常。如果出现以下情况,则不会发生这种情况:
- 我没有将复杂属性设置为新实例,而是设置了复杂类型本身的属性(例如:object.ComplexProp1.Value = "yes")
- 我使用STE方式。从上下文 1 中获取对象,将更改应用到上下文 2 并将其保存在那里。
但是始终保留复杂类型实例不是选项,STE 变体也不是。我不知道这是否是一种错误,或者我可能会改变什么来防止这个错误。有没有人至少有预感那里发生了什么?谢谢!