2013-07-03 1 views
3

Это моя модель:Исключения в 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))); 

Here «S StackTrace из error.

По сути, исключение выбрасывается из-за того, что рекурсивный вызов возвращает внутреннее включение как вызов метода, без его обработки и возврата свойства коллекции, предназначенного для его раскрытия.

ответ

2

Извините, мне потребовалось некоторое время, чтобы вернуться к вам.

У меня 3 часа ночи, и у меня было немного вина, но проблема исправлена ​​:) Если вы получите последнюю версию кода @https://github.com/refactorthis/GraphDiff, она должна работать нормально.

В ближайшее время я обновлю новый пакет nuget (RefactorThis.GraphDiff).

+0

Haha !! Человек после моего сердца! Я уверен, что это поможет вам решить проблему ... – Shimmy