Отображение Enum из String - PullRequest
       25

Отображение Enum из String

27 голосов
/ 17 октября 2008

У меня есть строковый столбец в таблице базы данных, который отображается в Enum в коде. В моем файле dbml, когда я устанавливаю «Тип» на MyTypes.EnumType, я получаю следующую ошибку:

Ошибка 1 DBML1005: сопоставление между DbType 'VarChar (50) NOT NULL' и Тип «MyTypes.EnumType» в столбце «EnumCol» типа «Table1» не является поддерживается.

Этот вопрос: LINQ to SQL строк для перечислений указывает на то, что то, что я пытаюсь сделать, возможно, но как это сделать?

Ответы [ 3 ]

34 голосов
/ 17 октября 2008

Любопытно - должно работать IIRC; Я посмотрю, смогу ли я сделать быстрый пример - однако вы можете проверить, что у вас есть полное имя enum (то есть, включая пространство имен).

[обновление] С здесь кажется, что RTM-версия поставлена ​​с ошибкой при разрешении перечисления. Один из предложенных способов обхода (на этой странице) - добавить префикс global::. Это прекрасно работает без этого обходного пути, так что, возможно, это исправлено в 3.5 SP1? Он также предположительно работает в 3.5, если вы используете неквалифицированное имя, если enum находится в том же пространстве имен.

[пример] Да, работал нормально: в 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
17 голосов
/ 18 октября 2009

Я знаю, что на это ответили, но я все еще получаю эту ошибку также. Очень странно.

В любом случае, я нашел решение. Вам нужно PREPEND полное пространство имен перечисления с global::

как WTF? Именно так. Я знаю, это звучит очень странно. Вот пример экрана =>

альтернативный текст http://img11.imageshack.us/img11/7517/lolzqg.png

Так хромает: (

В любом случае, я не понял этого. Какой-то чувак по имени Мэтт сделал. И он опубликовал сообщение об ошибке в MS Connect, и они не могут его воспроизвести, поэтому, я думаю, это не исправлено.

В любом случае, HTH.

1 голос
/ 19 августа 2010

Если вы добавите global :: qualyfier и нажмете Control + пробел над типом в файле designer.cs, он распознает тип и вы сможете удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...