我在数据库表中有一个字符串列,它在代码中映射到Enum。在我的dbml文件中,当我将“Type”设置为MyTypes.EnumType
时,我收到以下错误:
错误1 DBML1005:DbType'VarChar(50)NOT NULL'和。之间的映射 在类型'Table1'的列'EnumCol'中键入'MyTypes.EnumType'不是 支撑。
这个问题: LINQ to SQL strings to enums 表示我想做的事情是可能的,但它是如何完成的?
答案 0 :(得分:34)
好奇 - 它应该工作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
答案 1 :(得分:17)
我知道这已经得到了解答,但我仍然会收到此错误。非常奇怪。
无论如何,我找到了解决方案。您需要使用global::
alt text http://img11.imageshack.us/img11/7517/lolzqg.png
太蹩脚了:(
无论如何,我没想到这一点。一些叫Matt的家伙做了。他发布了一个关于MS Connect的错误报告,他们无法重新编写它,所以它没有修复,我想。
无论如何,HTH。
答案 2 :(得分:1)
如果添加global :: qualyfier并在Designer.cs文件中的类型上按Control +空格,它会识别该类型,您可以将其删除。