【问题标题】:Mapping Enum from String从字符串映射枚举
【发布时间】:2019-02-13 13:24:45
【问题描述】:

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

错误 1 ​​DBML1005:DbType 'VarChar(50) NOT NULL' 和 类型“Table1”的“EnumCol”列中的类型“MyTypes.EnumType”不是 支持。

这个问题: LINQ to SQL strings to enums 表示我正在尝试做的事情是可能的,但它是如何做到的?

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

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

    [更新] 从here 看来,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
    

    【讨论】:

    • 我必须在 3.5 SP1 前添加“global::”。也许是因为我更改了 DataContext (Project.Dal) 和实体 (Project.Dal.Entities) 的默认命名空间?
    【解决方案2】:

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

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

    喜欢WTF?确切地。我知道这听起来很奇怪。这是一个示例屏幕=>

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

    太蹩脚了:(

    无论如何,我没有弄清楚这一点。一些叫Matt的家伙确实做到了。他在 MS Connect 上发布了一个错误报告,他们无法重现它,所以它没有修复,我猜。

    无论如何,HTH。

    【讨论】:

    • 对于任何 VB.NET 用户的快速说明,Type 语法应该是“Global.
    • 所以你的意思是,“这是一个陷阱”?
    • 我确实是!我们必须给那些微软开发者更多的时间,把所有的代码都集中在那个超级明星项目上!
    【解决方案3】:

    如果您添加 global:: quallyfier 并在 Designer.cs 文件中的类型上按 Control + 空格,它会识别该类型并且您可以将其删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 2017-12-06
      • 2019-01-29
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多