无法找到类型或命名空间名称Edm,您缺少using指令或程序集引用

时间:2014-12-15 12:29:52

标签: visual-studio-2012 odata .net-assembly t4 ado.net-entity-data-model

所有

有关用于开发ASP.NET应用程序的技术环境的详细信息:

  • .NET Framework 4.5
  • Microsoft Visual Studio 2012 Ultimate with Update 4
  • System.Web.Http.OData(Version 5.3.1.0),作为Visual Studio中的引用.NET程序集
  • System.Web.OData(版本5.3.1.0),作为Visual Studio中的引用.NET程序集
  • Microsoft.OData.Edm(版本6.8.1.0),作为Visual Studio中的引用.NET程序集

我们有一个类,其中包含以下删除方法:

public IHttpActionResult Delete([FromODataUri] Edm.Guid id){...}

可悲的是,上述方法Edm.Guid抱怨以下错误:

类型或命名空间名称' Edm'找不到(你错过了使用指令或汇编引用吗?)

我无法删除Edm,因为上述代码是使用T4模板生成的,删除Edm会很痛苦。

无论如何,有些人可以告诉我这些代码将如何运作以使Edm得到认可吗?

- 的更新 我发现了一个非常规的解决方案,我不喜欢它,因为它具有不太复杂的意义,就像黑客一样。

在我的T4模板中,我有以下内容:

    var keyParameters = string.Join(", ", keys[entityName].Select(key => "[FromODataUri] " + (key.TypeUsage.ToString()).Substring((key.TypeUsage.ToString()).IndexOf(".") + 1).Trim()  + " " + code.Escape(key.Name).ToLower()));

...........
........
.....
public IHttpActionResult Delete(<#= keyParameters #>) {
...........
........
.....

它不够复杂,因为我正在做一些奇怪的字符串操作,以摆脱任何前缀为&#34; Edm。&#34; :

   (key.TypeUsage.ToString()).Substring((key.TypeUsage.ToString()).IndexOf(".")

请随意提出更好的替代解决方案。

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试解析OData类型名称。这些是well-known,从名称到类型是usually parsed with a map,而不是字符串操作。以下内容可行:

var typeMap = new Dictionary<string, Type> 
{
    { "Edm.Binary", typeof(Byte[]) },
    { "Edm.Boolean", typeof(Boolean) },
    { "Edm.Byte", typeof(Byte) },
    { "Edm.DateTime", typeof(DateTime) },
    { "Edm.Decimal", typeof(Decimal) },
    { "Edm.Double", typeof(Double) },
    { "Edm.Single", typeof(Single) },
    { "Edm.Guid", typeof(Guid) },
    { "Edm.Int16", typeof(Int16) },
    { "Edm.Int32", typeof(Int32) },
    { "Edm.Int64", typeof(Int64) },
    { "Edm.SByte", typeof(SByte) },
    { "Edm.String", typeof(String) },
    { "Edm.Time", typeof(TimeSpan) },
    { "Edm.DateTimeOffset", typeof(DateTimeOffset) },
}

var edmTypeName = "Edm.Guid";
var typeName = "global::" + typeMap.SingleOrDefault(t => t.Key.Equals(edmTypeName, StringComparison.CurrentCultureIgnoreCase)).Value.FullName;
Debug.Assert(typeName == "global::System.Guid");

话虽这么说,你可以通过别名System命名空间来变得聪明。将using Edm = System;添加到模板的顶部将适用于大多数基本类型,但这是一个黑客。