这是我的模特:
- 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
本质上,抛出异常是因为递归调用将内部include作为方法调用返回,而不处理它并返回它要暴露的集合属性。
答案 0 :(得分:2)
我凌晨3点,我已经喝了不少葡萄酒,但问题已解决了:)如果您获得最新版本的代码@ https://github.com/refactorthis/GraphDiff,它应该可以正常工作。
我很快就会更新新的nuget包(RefactorThis.GraphDiff)。