Это моя модель:Исключения в Expression Trees
- 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
вызова (в том числе граф объектов для загрузки магазина объекта) пытается прикрепить WorkingPeriods
, похоже, что это не готов принять этот уровень глубины рекурсии. Я немного перепутал это, но я уверен, что кто-то с обширными знаниями в деревьях выражений сможет легко решить эту проблему. Любые предложения будут оценены по этому поводу.
Вот что включает в себя выражение пути должно быть создано как:
.Include(b =>
b.Branches.Select(br =>
br.OpeningTimes.Select(ot =>
ot.WorkingPeriods)));
По сути, исключение выбрасывается из-за того, что рекурсивный вызов возвращает внутреннее включение как вызов метода, без его обработки и возврата свойства коллекции, предназначенного для его раскрытия.
Haha !! Человек после моего сердца! Я уверен, что это поможет вам решить проблему ... – Shimmy