实体框架 - System.Data.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship中的NullReferenceException

时间:2015-03-13 17:25:59

标签: entity-framework entity-framework-4

有时当我在dbcontext上调用save更改时,我会得到一个空引用异常。这仅在少数情况下发生。

当我执行以下操作时失败。

  

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   wrappedEntity)at   System.Data.Objects.EntityEntry.AddRelationshipDetectedByForeignKey(Dictionary 2 relationships, Dictionary 2 principalRelationships,EntityKey   relatedKey,EntityEntry relatedEntry,RelatedEnd relatedEndFrom)at   System.Data.Objects.EntityEntry.DetectChangesInForeignKeys()at   System.Data.Objects.ObjectStateManager.DetectChangesInForeignKeys(IList`1   在System.Data.Objects.ObjectStateManager.DetectChanges()

中的条目

我们使用EF 4.3

2 个答案:

答案 0 :(得分:0)

由于其中一个导航属性上没有相应的FK列,可能会遇到此问题。通过匹配PK-FK对检查所有相关的POCO类及其关系。另一方面,您可以查看数据表的数据库图以检查模式上的关系。如果它解决了问题,请告诉我,并在此处发布您的POCO课程定义。希望这会有所帮助...

答案 1 :(得分:0)

这是对旧问题的回答,但万一有其他人遇到它:

我的问题涉及使用JSONPatch方法并将更改直接修补到EF实体。补丁应用得很好,但是当我从多方面以1对多的关系为一个引用时,我遇到了这个错误。例如:

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也为空,并且在保存更改时它很好。如果我之后进行了检查,那么MyBar_Id非空,我会遇到此错误。

我的解决方案是调整JSONPatch进程,然后在将属性设置为null之前检​​查它是否已经有值。如果它确实它也是一个EF映射对象,检索它(强制延迟初始化),然后使用反射来获取它自己的所有属性。这会强制初始化所有Bar个对象属性,在两侧加载FK并解决问题。

这是一个臭虫,并且解决方法很糟糕,但确实解决了这个问题。