【问题标题】:Entity Framework - NullReferenceException in System.Data.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship实体框架 - System.Data.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship 中的 NullReferenceException
【发布时间】:2017-03-16 06:50:29
【问题描述】:
当我在 dbcontext 上调用保存更改时,有时会出现空引用异常。这仅在少数情况下发生。
当我执行以下操作时失败。
entityObject.SomeForeignKeyId= X 其中 X 是一个整数;
同样的代码适用于
entityObject.SomeForeignKeyId= Y 其中 Y 是整数且不等于
X;
作为一种解决方法,我们一直在使用
entityObject.SomeForeignKey= Repository.Some.Find(X);
System.Web.HttpUnhandledException (0x80004005): 类型异常
'System.Web.HttpUnhandledException' 被抛出。 --->
System.NullReferenceException:对象引用未设置为实例
的一个对象。在
System.Data.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship(IEntityWrapper
包裹实体)在
System.Data.Objects.EntityEntry.AddRelationshipDetectedByForeignKey(Dictionary2
relationships, Dictionary2 principalRelationships, EntityKey
relatedKey, EntityEntry relatedEntry, RelatedEnd relatedEndFrom) 在
System.Data.Objects.EntityEntry.DetectChangesInForeignKeys() 在
System.Data.Objects.ObjectStateManager.DetectChangesInForeignKeys(IList`1
条目)在 System.Data.Objects.ObjectStateManager.DetectChanges()
我们使用 EF 4.3
【问题讨论】:
标签:
entity-framework
entity-framework-4
【解决方案1】:
由于导航属性之一上没有对应的 FK 列,可能会遇到此问题。通过匹配 PK-FK 对来检查所有相关的 POCO 类及其关系。另一方面,您可以查看数据表的数据库图表以检查模式上的关系。请让我知道它是否解决了问题,并在此处发布您的 POCO 类定义。希望这会有所帮助...
【解决方案2】:
这是一个老问题的答案,但万一其他人遇到它:
我的问题涉及使用 JSONPatch 方法并将更改直接修补到 EF 实体上。补丁应用得很好,但是当我从多方面以一对多关系取消引用时,我遇到了这个错误。例如:
public class Foo
{
public int Id {get; set;}
public int? MyBar_Id {get; set;}
public Bar MyBar {get; set;}
}
public class Bar
{
public int Id {get; set;}
public List<Foo> MyFoos {get; set;}
}
如果我刚刚将 Foo 作为 DynamicProxy 加载并使用我的 JSONPatch 仅将 MyBar 属性设置为 null,我会遇到此错误。然而,我注意到当我使用调试器检查对象时,行为发生了显着变化。如果我在应用补丁之前检查了它,当将MyBar 设置为 null 时,MyBar_Id 也是 null 并且保存更改时它很好。如果我事后检查,那么MyBar_Id 不为空,我会遇到这个错误。
我的解决方案是调整 JSONPatch 过程,并在将属性设置为 null 之前检查它是否已经有值。如果它是并且它也是一个 EF 映射对象,则检索它(强制延迟初始化),然后使用反射来获取它自己的所有属性。这会强制初始化所有 Bar 对象属性,在两侧加载 FK,问题就解决了。
这是一个非常糟糕的错误,解决方法很糟糕,但它确实解决了问题。