2012-10-04 52 views
5

Tengo un problema con enum mapeo con fluidez NHibernate. Sé que esta pregunta se me ha hecho muchas veces, pero no he podido encontrar ninguna solución que me haya funcionado. Soy novato en NHibernate y parece que me he perdido algo simple y estúpido. Aquí está mi código.Fluidez Nhibernate Enum Mapeo

public class DBPublication 
{ 
    public virtual int pub_id { get; set; } 
    public virtual PublicationStatuses status { get; set; } 
    ... 
} 

public enum PublicationStatuses 
{ 
    on_moderation, 
    active, 
    ... 
} 


public class DBPublicationMap : ClassMap<DBPublication> 
{ 
    public DBPublicationMap() 
    { 
     Table("content.publications"); 
     Id(x => x.pub_id).GeneratedBy.Sequence("content.pub_sq");   
     Map(x => x.status); 
     ... 
    } 
} 

postgres enumeración de tipo

CREATE TYPE content.enum_publication_status AS ENUM('on_moderation', 'active', ...); 

pero cuando intento de salvar, postgres lanza este

column "status" is of type content.enum_publication_status but expression is of type text 

alguna sugerencia?

Respuesta

6

Aquí hay una muestra de trabajo de configuración de nhibernate para almacenar el campo enum.

public class Entity 
{ 
    public virtual int id { get; set; } 

    public virtual SomeEnum EnumField { get; set; } 
} 

public enum SomeEnum 
{ 
    Value1, 
    Value2 
} 

class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Id(x => x.id).GeneratedBy.Native(); 
     Map(x => x.EnumField); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var factory = Fluently.Configure().Mappings(x => x.FluentMappings.AddFromAssemblyOf<Entity>()) 
           .ExposeConfiguration(config => new SchemaExport(config).Create(false, true)) 
           .Database(MsSqlConfiguration.MsSql2008.ConnectionString("Data Source=.;Initial Catalog=nhtest;Integrated Security=True")) 
           .BuildSessionFactory(); 
     using (var session = factory.OpenSession()) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 
       var entity = new Entity(); 
       entity.EnumField = SomeEnum.Value2; 
       session.Save(entity); 
       transaction.Commit(); 
      } 
     } 

    } 
} 

En tal caso, se almacena como cadenas en la base de datos. Si usted quiere que se guardará como números enteros, es necesario cambiar el mapeo de propiedad de campo Enum a lo siguiente:

Map(x => x.EnumField).CustomType<int>(); 
+1

solución u sólo funciona si el tipo de columna de la tabla es entero pero necesito a medida tipo postgres enumeración, por lo que sólo consiguió la otra excepción: "columna 'estado' es de tipo content.enum_publication_status pero la expresión es de tipo int Eger "pero gracias de todos modos. Creo que necesito simplemente cambiar el tipo de columna y olvidarlo :) – maxs87

0

¿Por qué está creando tipos enum en progresión? ¿No es esto una pesadilla de mantenimiento? ¿Cómo se ve tu configuración? ¿Ya ha intentado usar las convenciones descritas here? Parece un simple error de conversión, así que considere usar CustomType()/CustomSQLType() dentro de su asignación.

0

sólo tiene que añadir esta clase a su proyecto:

public class PgEnumMapper<T> : NHibernate.Type.EnumStringType<T> 
{ 
    public override NHibernate.SqlTypes.SqlType SqlType 
    { 
     get { return new NHibernate.SqlTypes.SqlType(System.Data.DbType.Object); } 
    } 
} 

A continuación, puede utilizar:

Map(x => x.status).CustomType<PgEnumMapper<PublicationStatuses>>(); 
+0

¿Puedes dar un ejemplo de selección por un 'PublicationStatus' en particular? – heyNow

Cuestiones relacionadas