将字符串映射到枚举类型

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

错误1 DBML1005:在类型“Table1”的列“EnumCol”中,DbType 'VarChar(50)NOT NULL' 和类型'MyTypes.EnumType'之间的映射不受支持。

这个问题LINQ to SQL strings to enums表明我想要做的是可能的,但是应该如何实现呢?
3个回答

34

有趣的是 - 按照我所记得的应该能够工作; 我会看看是否可以提供一个快速的示例 - 然而,您可能需要检查您是否拥有完全限定的枚举名称(即包括命名空间)。

[更新] 从这里看起来,RTM版在解析枚举时存在一个错误。该页面上建议一种解决方法是添加global ::前缀。对我来说,没有这个解决方法也可以正常工作,因此可能在3.5 SP1中已经修复了这个问题?如果枚举与同一命名空间中,则使用未限定名称的情况下,在3.5中据称也可以很好地工作。

[示例] 是的,正常工作:使用Northwind,我为运输国家定义了一个枚举:

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

5
在3.5 SP1中,我不得不在"global::"前加上前缀。可能是因为我改变了DataContext(Project.Dal)和实体(Project.Dal.Entities)的默认命名空间。 - jrummell

17
我知道这个问题已经有人回答过了,但是我还是遇到了同样的错误。非常奇怪。
不管怎样,我找到了一个解决方案。你需要在枚举的完整命名空间前面加上global::。我知道听起来很奇怪。
不管怎样,这不是我自己发现的。一个叫Matt的家伙发现了。他在MS Connect上提交了一个错误报告,但他们无法重现这个问题,所以我猜它还没有修复。

1
任何 VB.NET 用户请注意,类型语法应为 "Global.<fully-qualified-enum-type>"。 - Quango
1
那么你的意思是,“这是个陷阱”? - Mark Sowul
1
我确实是!我们必须给那些微软开发人员更多时间,将所有代码集中在那个超级明星项目上! - Pure.Krome

1

如果在designer.cs文件中添加global:: qualyfier并在类型上按Control + space,则它将识别该类型,您可以将其删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接