无法将类型为"Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType"的对象强制转换为"Microsoft.OData.Edm.IEdmCollectionType"

Pyn*_*ynt 4 c# visual-studio odata odata-v4

在Visual Studio 2013中,我使用Nuget中的OData客户端代码生成器来使用OData V4端点.出乎意料的是,本周t4模板给出了错误:无法将类型为"Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType"的对象强制转换为"Microsoft.OData.Edm.IEdmCollectionType".

我正在使用7个OData端点,并且只有其中一个在后端需要重新保存*.tt文件的更新.保存后出现错误并将输出*.cs文件留空.然后,我尝试在OData端点保存一个没有模型更改的*.tt文件,以查看它的行为方式.思考过程可能是端点模型的变化可能与客户端代码生成器不兼容.不幸的是,一个失败并产生了一个空白的*.cs文件以及相同的错误.

幸运的是,所有内容都使用git进行版本控制,我能够回滚文件以保持项目正常运行.

将此放在此处以防其他任何人升级他们的OData客户端代码生成器并感到沮丧.

Pyn*_*ynt 7

问题原来是从以下版本升级:OData Client T4 Template ver.2.2.0到OData客户端T4模板版本.2.4.0

在版本之间添加了一些新项目,使您的旧*.TTInclude文件无效.

解决问题的步骤

  • 您只需从旧的*.tt文件复制您的设置,如MetadataDocumentUri和NamespacePrefix
  • 删除旧的*.tt文件和*.ttinclude文件,因为*.ttinclude不再兼容
  • 使用所需名称创建一个新文件(使用"添加">"新建项">"OData客户端")
  • 将以前复制的设置粘贴到位,然后点击保存

上述步骤应该可以解决问题.

我注意到其中一个变化的一些变化.

在ttinclude中添加了一个新的命名空间

<#@ Import Namespace="Microsoft.OData.Edm.Vocabularies.Community.V1" #>
Run Code Online (Sandbox Code Playgroud)

添加了一个新的DeclaredValueTerm:

tmp.FindDeclaredValueTerm(AlternateKeysVocabularyConstants.AlternateKeys) != null)
Run Code Online (Sandbox Code Playgroud)

一种新的抽象方法:

internal abstract void WriteEntityTypeAttribute();
Run Code Online (Sandbox Code Playgroud)

以及一些其他杂项,使您以前的模板无效.希望这对任何为OData V4升级OData客户端代码生成器的人都有帮助.