Невозможно привести объект типа Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType к типу Microsoft.OData.Edm.IEdmCollectionType

В Visual Studio 2013 я использую конечную точку OData V4 с помощью генератора клиентского кода OData, найденного в Nuget. Неожиданно на этой неделе шаблон t4 выдал ошибку: Невозможно привести объект типа Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType к типу Microsoft.OData.Edm.IEdmCollectionType.

У меня есть 7 конечных точек OData, с которыми я работаю, и только у одной из них было обновление на серверной части, которое потребовало повторного сохранения файла * .tt. При сохранении ошибка появилась и оставила выходной файл * .cs пустым. Затем я попытался сохранить один из файлов * .tt, в котором не было изменений модели в конечной точке OData, чтобы посмотреть, как он себя ведет. Мысль заключалась в том, что, возможно, изменение модели в конечной точке каким-то образом несовместимо с генератором клиентского кода. К сожалению, это не удалось, и с той же ошибкой был получен пустой файл * .cs.

К счастью, все версируется с помощью git, и я смог откатить файлы, чтобы проект продолжал работать.

Поместите это здесь на случай, если кто-то еще обновит свой генератор кода клиента OData и расстроится.


person Pynt    schedule 22.09.2015    source источник


Ответы (1)


Проблема оказалась в обновлении с: OData Client T4 Template ver. 2.2.0 для шаблона клиента OData T4 вер. 2.4.0

Между версиями добавлено несколько новых элементов, которые делают ваши старые файлы * .TTInclude бесполезными.

ДЕЙСТВИЯ ПО УСТРАНЕНИЮ ПРОБЛЕМЫ

  • Вы можете просто скопировать свои настройки из старых файлов * .tt, таких как MetadataDocumentUri и NamespacePrefix.
  • Удалите старый файл * .tt и файл * .ttinclude, поскольку * .ttinclude больше не совместим
  • Создайте новый файл с желаемым именем (используя Добавить> Новый элемент> Клиент OData)
  • Вставьте ранее скопированные настройки на место и нажмите "Сохранить".

Вышеуказанные шаги должны решить проблему.

Некоторые из изменений, которые я заметил при разнице в одном из файлов ttincludes.

В ttinclude было добавлено новое пространство имен

<#@ Import Namespace="Microsoft.OData.Edm.Vocabularies.Community.V1" #>

Был добавлен новый DeclaredValueTerm:

tmp.FindDeclaredValueTerm(AlternateKeysVocabularyConstants.AlternateKeys) != null)

Новый абстрактный метод:

internal abstract void WriteEntityTypeAttribute();

И несколько других вещей, которые делают ваши предыдущие шаблоны недействительными. Надеюсь, это поможет всем, кто обновляет генератор кода клиента OData для OData V4.

person Pynt    schedule 22.09.2015