2008-10-17 11 views
27

Mam kolumnę ciągów w tabeli bazy danych, która mapuje do Enum w kodzie. W moim pliku dbml po ustawieniu "Typ" na MyTypes.EnumType pojawia się następujący błąd:Mapowanie Enum ze stringa

Błąd 1 DBML1005: Odwzorowanie między DbType "VarChar (50) NOT NULL" i wpisz "MyTypes.EnumType" w kolumnie " EnumCol "typu" Tabela1 "nie jest obsługiwany.

To pytanie: LINQ to SQL strings to enums wskazuje, że to, co próbuję zrobić, jest możliwe, ale jak to się robi?

Odpowiedz

33

Ciekawy - powinien działać IIRC; Zobaczę, czy mogę zrobić szybki przykład - możesz jednak sprawdzić, czy masz w pełni kwalifikowaną nazwę wyliczeniową (to znaczy zawierającą przestrzeń nazw).

[aktualizacja] Od wersji here wydaje się, że wersja RTM została dostarczona z błędem podczas rozwiązywania wyliczenia. Jednym z sugerowanych obejść (na tej stronie) było dodanie prefiksu global::. Działa to dobrze dla mnie bez tego obejścia, więc może jest naprawiony w 3.5 SP1? Prawdopodobnie działa poprawnie również w wersji 3.5, jeśli używasz niekwalifikowanej nazwy, jeśli enum znajduje się w tej samej przestrzeni nazw.

[przykład] Tak, pracował w porządku: z Northwind, ja zdefiniowane enum dla kraju wysyłki:

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

I wtedy redagował dbml mieć:

<Column Name="ShipCountry" Type="Foo.Bar.MyEnum" DbType="NVarChar(15)" CanBeNull="true" /> 

generowany ten:

private Foo.Bar.MyEnum _ShipCountry; 
//... 
[Column(Storage="_ShipCountry", DbType="NVarChar(15)", CanBeNull=true)] 
public Foo.Bar.MyEnum ShipCountry 
{ get {...} set {...} } 

Wreszcie napisał zapytanie:

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); 
    } 
} 

Obrobiona grzywna; wyniki:

10250, Brazil 
10252, Belgium 
10253, Brazil 
10256, Brazil 
10261, Brazil 
10287, Brazil 
10290, Brazil 
10291, Brazil 
10292, Brazil 
10299, Brazil 
+0

Zadziałało, gdy dostałem 3,5 SP1 – Barry

+5

Musiałem przed "globalnym ::" z 3.5 SP1. Może to dlatego, że zmieniłem domyślny obszar nazw dla DataContext (Project.Dal), a także dla encji (Project.Dal.Entities)? – jrummell

17

Wiem, że odpowiedź została udzielona, ​​ale nadal otrzymuję ten błąd również. Bardzo dziwne.

W każdym razie znalazłem rozwiązanie. Musisz PREPEND pełną przestrzeń nazw enum z global::

jak WTF? Dokładnie. Wiem, że to brzmi bardzo dziwnie. Oto przykład screenie =>

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

Więc lame :(

W każdym razie, ja nie wymyślimy. Jakiś koleś nazywa Matt, nie. A on opublikowany raport o błędzie na MS Connect i nie mogą one powtórzenia błędu go więc nie jest stała, tak myślę.

Anyways, HTH.

+1

Szybka uwaga dla każdego VB.Użytkownicy NET, składnia Type powinna brzmieć "Global. " – Quango

+1

Więc to, co mówisz, to "to pułapka"? –

+1

Rzeczywiście jestem! Musimy dać tym programistom MS więcej czasu, skoncentrować cały kod na tym projekcie Super Star! –

1

Jeśli dodać globalny :: qualyfier i naciśnij Control + przestrzeń nad czcionką w designer.cs złożyć uznaje typ i ty można go usunąć.