I have a string column in a database table which maps to an Enum in code. In my dbml file when I set the "Type" to MyTypes.EnumType I get the following error:
Error 1 DBML1005: Mapping between DbType 'VarChar(50) NOT NULL' and Type 'MyTypes.EnumType' in Column 'EnumCol' of Type 'Table1' is not supported.
This question: http://stackoverflow.com/questions/4939/linq-to-sql-strings-to-enums indicates that what I am trying to do is possible, but how is it done?
-
Curious - it should work IIRC; I'll see if I can do a quick example - however, you might want to check that you have the fully-qualified enum name (i.e. including the namespace).
[update] From here it seems that the RTM version shipped with a bug when resolving the enum. One workaround suggested (on that page) was to add the
global::
prefix. It works fine for me without this workaround, so maybe it is fixed in 3.5 SP1? It also allegedly works fine in 3.5 if you use the unqualified name if the enum is in the same namespace.[example] Yup, worked fine: with Northwind, I defined an enum for the shipping country:
namespace Foo.Bar { public enum MyEnum { France, Belgium, Brazil, Switzerland } }
I then edited the dbml to have:
<Column Name="ShipCountry" Type="Foo.Bar.MyEnum" DbType="NVarChar(15)" CanBeNull="true" />
This generated:
private Foo.Bar.MyEnum _ShipCountry; //... [Column(Storage="_ShipCountry", DbType="NVarChar(15)", CanBeNull=true)] public Foo.Bar.MyEnum ShipCountry { get {...} set {...} }
And finally wrote a query:
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); } }
Worked fine; results:
10250, Brazil 10252, Belgium 10253, Brazil 10256, Brazil 10261, Brazil 10287, Brazil 10290, Brazil 10291, Brazil 10292, Brazil 10299, Brazil
Barry : It worked when I got 3.5 SP1jrummell : I had to prepend "global::" with 3.5 SP1. Maybe its because I changed the default namespace for the DataContext (Project.Dal) and also for the entities (Project.Dal.Entities)?From Marc Gravell -
I know this has been answered, but i'm still getting this error also. Very weird.
Anyways, I found a solution. You need to PREPEND the full namespace of the enum with
global::
like WTF? Exactly. I know it sounds very weird. Here's an example screenie =>
So lame :(
Anyways, I didn't figure this out. Some dude called Matt, did. And he posted a bug report on MS Connect and they can't repro it so it's not fixed, I guess.
Anyways, HTH.
Quango : Quick note for any VB.NET users, the Type syntax should be "Global." From Pure.Krome -
If you add the global:: qualyfier and press Control + space over the type in the designer.cs file it recognizes the type and you can remove it.
From Manuel Castro
0 comments:
Post a Comment