gpt4 book ai didi

entity-framework - 表达式树中的异常

转载 作者:行者123 更新时间:2023-12-04 08:31:52 24 4
gpt4 key购买 nike

这是我的模型:

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

现在我有一个 Controller 操作,它接受一个表单,该表单由所有数据组成,作为一个 Business 实体,其所有属性和集合都设置良好。

现在我必须递归地遍历所有属性和集合,并与数据库图进行比较;如果它们不存在,则添加它们,如果它们确实再次遍历所有属性并执行相同的更深层次,直到没有导航属性被遗忘。由于我的属性和后代比上一个示例中提到的要多得多,因此只需在里面手动遍历它们即可。

感谢this answer 我发现 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: Unable to cast object of type 'System.Linq.Expressions.MethodCallExpressionN' to type 'System.Linq.Expressions.MemberExpression'.

我尝试调试源代码,但我不是表达式树专家,当内部 Include 调用(包含对象图以加载存储对象)尝试附加 WorkingPeriods,看起来它还没有准备好接受那种深度的递归。我搞砸了一点,但我相信在表达式树方面具有广泛知识的人能够轻松解决这个问题。任何建议将不胜感激。

下面是应该生成的包含路径表达式:

.Include(b =>
b.Branches.Select(br =>
br.OpeningTimes.Select(ot =>
ot.WorkingPeriods)));

Hereerror 的堆栈跟踪.

本质上,抛出异常是因为递归调用返回内部包含作为方法调用,而不处理它并返回它打算公开的集合属性。

最佳答案

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

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

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

关于entity-framework - 表达式树中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17450383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com