当前位置:  开发笔记 > 编程语言 > 正文

从字符串映射枚举

如何解决《从字符串映射枚举》经验,为你挑选了2个好方法。

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

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

这个问题: LINQ to SQL字符串到枚举 表明我想要做的是可能的,但它是如何完成的?



1> Marc Gravell..:

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

[更新]从这里看,RTM版本在解析枚举时附带了一个bug.建议(在该页面上)的一个解决方法是添加global::前缀.没有这种解决方法,它对我来说工作正常,所以它可能在3.5 SP1中修复?如果你使用非限定名称,如果枚举在同一名称空间中,它也可以在3.5中正常工作.

[例子]是的,工作正常:使用Northwind,我为发货国定义了一个枚举:

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

然后我编辑了dbml以便:


这产生了:

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


我必须在3.5 SP1之前加上"global ::".也许是因为我更改了DataContext(Project.Dal)的默认命名空间以及实体(Project.Dal.Entities)的默认命名空间?

2> Pure.Krome..:

我知道这已经得到了解答,但我仍然会收到此错误.很奇怪.

无论如何,我找到了解决方案.您需要预先使用枚举的完整命名空间global::

喜欢WTF?究竟.我知道这听起来很奇怪.这是一个示例screenie =>

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

太蹩脚了:(

无论如何,我没想到这一点.有些家伙打电话给马特.并且他发布了一个关于MS Connect的错误报告,他们无法重复它,所以它不是固定的,我想.

不管怎样,HTH.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有