Невозможно привести объект типа "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.