这是我的模型:
- Business
- BusinesType - FK
- Categories (*) - FK
- Branch (*)
- BranchType - FK
- Address
- Phone (*)
- CustomFields (*)
- OpeningTimes (*)
- WorkingPeriods (*)
- .....
现在我有一个控制器动作,它接受一个表单,该表单由整个数据作为一个Business
实体组成,其所有属性和集合都设置得很好。
现在我必须递归遍历所有属性和集合,并与数据库图进行比较;如果它们不存在,则添加它们,如果它们确实再次遍历所有属性并执行相同的更深层次,直到没有留下任何导航属性。由于我有比上一个示例中提到的更多的属性和后代,所以它只是在里面手动遍历它们。
多亏了这个答案,我发现 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”类型。
我尝试调试源代码,但我不是表达式树的专家,当内部Include
调用(包括对象图以加载存储对象)尝试附加时会出现问题WorkingPeriods
,看起来它还没有准备好接受那个深度级别递归。我有点搞砸了,但我相信在表达式树方面具有广泛知识的人将能够轻松解决这个问题。任何建议将不胜感激。
这是包含路径表达式应该生成的内容:
.Include(b =>
b.Branches.Select(br =>
br.OpeningTimes.Select(ot =>
ot.WorkingPeriods)));
本质上,抛出异常是因为递归调用将内部包含作为方法调用返回,而不对其进行处理并返回它打算公开的集合属性。