2008-10-17 208 views
27

我有一个数据库表中的字符串列映射到代码中的枚举。在我的dbml文件中,当我将“类型”设置为MyTypes.EnumType时,出现以下错误:从字符串映射枚举

错误1 DBML1005:DbType'VarChar(50)NOT NULL'与类'MyTypes.EnumType'类型'Table1'的EnumCol'不受支持。

此问题: LINQ to SQL strings to enums 表明我正在尝试做的事情是可能的,但它是如何完成的?

回答

33

好奇 - 它应该工作IIRC;我会看看我能否做一个快速示例 - 但是,您可能想要检查是否具有完全限定的枚举名称(即包含名称空间)。

[更新]从​​看来RTM版本在解析枚举时带有错误。建议的一种解决方法(在该页面上)是添加global::前缀。如果没有这个解决方法,它对我来说工作得很好,所以它可能在3.5 SP1中得到修复?如果您使用非限定名称(如果枚举位于同一名称空间中),则它也可以在3.5中正常运行。

[示例]烨,工作得很好:与罗斯文,我定义枚举为航运国家:

namespace Foo.Bar 
{ 
    public enum MyEnum 
    { 
     France, 
     Belgium, 
     Brazil, 
     Switzerland 
    } 
} 

然后我编辑dbml的有:

<Column Name="ShipCountry" Type="Foo.Bar.MyEnum" DbType="NVarChar(15)" CanBeNull="true" /> 

这产生:

private Foo.Bar.MyEnum _ShipCountry; 
//... 
[Column(Storage="_ShipCountry", DbType="NVarChar(15)", CanBeNull=true)] 
public Foo.Bar.MyEnum ShipCountry 
{ get {...} set {...} } 

最后写了一个查询:

using (DataClasses1DataContext ctx = new DataClasses1DataContext()) 
{ 
    var qry = from order in ctx.Orders 
       where order.ShipCountry == Foo.Bar.MyEnum.Brazil 
       || order.ShipCountry == Foo.Bar.MyEnum.Belgium 
       select order; 
    foreach (var order in qry.Take(10)) 
    { 
     Console.WriteLine("{0}, {1}", order.OrderID, order.ShipCountry); 
    } 
} 

工作正常;结果:

10250, Brazil 
10252, Belgium 
10253, Brazil 
10256, Brazil 
10261, Brazil 
10287, Brazil 
10290, Brazil 
10291, Brazil 
10292, Brazil 
10299, Brazil 
+0

它工作时,我得到3.5 SP1 – Barry 2008-10-17 13:53:47

+5

我不得不预先在3.5 SP1的“全球::”。也许是因为我改变了DataContext(Project.Dal)和实体(Project.Dal.Entities)的默认名称空间? – jrummell 2010-01-29 20:44:39

17

我知道这已被回答,但我仍然得到这个错误也。很奇怪。

无论如何,我找到了解决方案。您需要PREPEND枚举的完整名称空间与global::

像WTF?究竟。我知道这听起来很奇怪。下面是一个例子的screenie =>

alt text http://img11.imageshack.us/img11/7517/lolzqg.png

所以跛脚:(

不管怎么说,我没有想出解决办法。所谓Matt一些纨绔子弟,没有。他贴在MS Connect和bug报告他们不能瑞普它,所以它不是固定的,我猜。

不管怎么说,HTH。

1

如果您在designer.cs添加全局:: qualyfier然后按Ctrl +空格在文件类型它承认类型和你可以删除它。