表达式树中的例外

时间:2013-07-03 14:13:15

标签: entity-framework graphdiff

这是我的模特:

 - Business
   - BusinesType - FK
   - Categories (*) - FK
   - Branch (*)
     - BranchType - FK
     - Address
     - Phone (*)
     - CustomFields (*)
     - OpeningTimes (*)
       - WorkingPeriods (*)
   - .....

现在我有一个控制器动作,它接受一个由整个数据组成的表单作为单个Business实体,其所有属性和集合都设置得很好。

现在我必须递归地遍历所有属性和集合,并与数据库图表进行比较;如果它们不存在,添加它们,如果它们再次遍历所有属性并执行相同的更深层次,直到没有剩余导航属性。由于我有比前一个例子中提到的更多的属性和后代,所以只需要手动遍历它们。

感谢this回答,我发现GraphDiff为这种情况提供了一个出色的解决方案。

这是我正在调用的更新查询:

    Context.UpdateGraph(business, bus => bus
      .AssociatedEntity(bu => bu.BusinessType)
      .AssociatedCollection(bu => bu.Categories)
      .OwnedCollection(bu => bu.Branches, branch => branch
        .AssociatedEntity(b => b.BranchType)
        .OwnedEntity(b => b.Address)
        .OwnedCollection(b => b.Phones)
        .OwnedCollection(b => b.CustomFields)
        .OwnedCollection(b => b.OpeningTimes, openingTimes => openingTimes
          .OwnedCollection(b => b.WorkingPeriods)
        )
      )
    );

它引发了这个异常:

  

System.InvalidCastException:无法将类型为“System.Linq.Expressions.MethodCallExpressionN”的对象强制转换为“System.Linq.Expressions.MemberExpression”。

我尝试调试源代码,但我不是Expression Trees的专家,当内部Include调用(包括加载存储对象的对象图)尝试附加{{1}时,会出现问题看起来它还没有准备好采取那种深度递归的程度。我稍微搞砸了一下,但我确信在表达树方面有广泛知识的人能够很容易地解决这个问题。任何建议都将受到赞赏。

这是包含路径表达式应该生成的内容,如:

WorkingPeriods

Hereerror的堆栈跟踪。

本质上,抛出异常是因为递归调用将内部include作为方法调用返回,而不处理它并返回它要暴露的集合属性。

1 个答案:

答案 0 :(得分:2)

抱歉,我花了一段时间才回复你。

我凌晨3点,我已经喝了不少葡萄酒,但问题已解决了:)如果您获得最新版本的代码@ https://github.com/refactorthis/GraphDiff,它应该可以正常工作。

我很快就会更新新的nuget包(RefactorThis.GraphDiff)。