2008-10-17 18 views
27

Tengo una columna de cadena en una tabla de base de datos que se asigna a un Enum en el código. En mi archivo dbml cuando configuro el "Tipo" a MyTypes.EnumType recibo el siguiente error:Asignación de Enum desde la cadena

Error 1 DBML1005: mapeo entre DbType 'VarChar (50) NOT NULL' y Tipo 'MyTypes.EnumType' en Columna ' EnumCol 'of Type' Table1 'no es compatible.

Esta pregunta: LINQ to SQL strings to enums indica que lo que estoy tratando de hacer es posible, pero ¿cómo se hace?

Respuesta

33

Curioso: debería funcionar IIRC; Veré si puedo hacer un ejemplo rápido; sin embargo, es posible que desee comprobar que tiene el nombre completo enum (es decir, incluido el espacio de nombres).

[update] De here parece que la versión RTM se envió con un error al resolver la enumeración. Una solución alternativa sugerida (en esa página) era agregar el prefijo global::. Funciona bien para mí sin esta solución, por lo que tal vez se solucione en 3.5 SP1? También supuestamente funciona bien en 3.5 si usa el nombre no calificado si la enumeración está en el mismo espacio de nombres.

[ejemplo] Sí, funcionó bien: con Neptuno, he definido una enumeración para el país de procedencia:

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

entonces editado el dbml tener:

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

Esto generó:

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

Y finalmente escribió una consulta:

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

Funcionó bien; resultados:

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

Funcionó cuando obtuve 3.5 SP1 – Barry

+5

tuve que anteponer "global ::" con 3.5 SP1. Tal vez es porque cambié el espacio de nombres predeterminado para el DataContext (Project.Dal) y también para las entidades (Project.Dal.Entities)? – jrummell

17

Sé que esto ha sido respondido, pero sigo recibiendo este error también. Muy raro.

De todos modos, encontré una solución. Necesita PREPENDER el espacio de nombre completo de la enumeración con global::

como WTF? Exactamente. Sé que suena muy raro. He aquí un ejemplo screenie =>

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

tan cojo :(

De todas formas, yo no resolver esto. Un tipo llamado Matt, lo hizo. Y él publicó un informe de error en MS Connect y no pueden repro que lo que no es fija, supongo.

de todas formas, HTH.

+1

Nota rápida para cualquier VB.Usuarios de NET, la sintaxis de Tipo debe ser "Global. " – Quango

+1

¿Entonces lo que está diciendo es, "es una trampa"? –

+1

¡Estoy realmente! ¡Tenemos que darles más tiempo a esos desarrolladores de MS, concentrar todo el código en ese Proyecto Súper Estrella! –

1

Si se agrega el mundial :: qualyfier y presione control + espacio sobre el tipo de los designer.cs presentar reconoce el tipo y tu puede eliminarlo

Cuestiones relacionadas