无法将类型 'Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType' 的对象转换为类型 'Microsoft.OData.Edm.IEdmCollectionType'
Unable to cast object of type 'Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType' to type 'Microsoft.OData.Edm.IEdmCollectionType'
在 Visual Studio 2013 年,我正在使用 Nuget 中的 OData 客户端代码生成器使用 OData V4 端点。没想到本周t4模板报错:Unable to cast object of type 'Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType' to type 'Microsoft.OData.Edm.IEdmCollectionType'.
我有 7 个正在使用的 OData 端点,其中只有一个在后端有更新,需要重新保存 *.tt 文件。保存时出现错误并将输出 *.cs 文件留空。然后,我尝试保存其中一个在 OData 端点没有模型更改的 *.tt 文件,以查看它的行为方式。思考过程是,端点模型的更改可能以某种方式与客户端代码生成器不兼容。不幸的是,一个失败并产生了一个空白的 *.cs 文件以及同样的错误。
幸运的是,所有内容都使用 git 进行了版本控制,我能够回滚文件以保留项目 运行。
将它放在这里以防其他人升级他们的 OData 客户端代码生成器并感到沮丧。
问题原来是升级自:
OData 客户端 T4 模板版本。 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 V4 的 OData 客户端代码生成器的任何人有所帮助。
在 Visual Studio 2013 年,我正在使用 Nuget 中的 OData 客户端代码生成器使用 OData V4 端点。没想到本周t4模板报错:Unable to cast object of type 'Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType' to type 'Microsoft.OData.Edm.IEdmCollectionType'.
我有 7 个正在使用的 OData 端点,其中只有一个在后端有更新,需要重新保存 *.tt 文件。保存时出现错误并将输出 *.cs 文件留空。然后,我尝试保存其中一个在 OData 端点没有模型更改的 *.tt 文件,以查看它的行为方式。思考过程是,端点模型的更改可能以某种方式与客户端代码生成器不兼容。不幸的是,一个失败并产生了一个空白的 *.cs 文件以及同样的错误。
幸运的是,所有内容都使用 git 进行了版本控制,我能够回滚文件以保留项目 运行。
将它放在这里以防其他人升级他们的 OData 客户端代码生成器并感到沮丧。
问题原来是升级自: OData 客户端 T4 模板版本。 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 V4 的 OData 客户端代码生成器的任何人有所帮助。