【问题标题】: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,问题就解决了。

      这是一个非常糟糕的错误,解决方法很糟糕,但它确实解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 2014-08-24
        • 1970-01-01
        相关资源
        最近更新 更多