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

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

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

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

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

1 ответ

Решение

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

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

ШАГИ, ЧТОБЫ УДАЛИТЬ НОМЕР

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

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

Некоторые из изменений, которые я заметил с помощью diff на одном из ttinclude.

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

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

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

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

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

internal abstract void WriteEntityTypeAttribute();

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

Другие вопросы по тегам