【发布时间】:2013-07-01 06:49:21
【问题描述】:
这是我的模型:
- 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”类型。
我尝试调试源代码,但我不是表达式树专家,当内部 Include 调用(包括对象图以加载存储对象)尝试附加 WorkingPeriods 时会出现问题,看起来像它还没有准备好接受那种深度的递归。我有点搞砸了,但我确信在表达式树方面具有广泛知识的人将能够轻松解决这个问题。任何建议都将不胜感激。
这是包含路径表达式应该生成的内容:
.Include(b =>
b.Branches.Select(br =>
br.OpeningTimes.Select(ot =>
ot.WorkingPeriods)));
本质上,抛出异常是因为递归调用将内部包含作为方法调用返回,而不对其进行处理并返回它打算公开的集合属性。
【问题讨论】:
标签: entity-framework graphdiff