2012-10-04 12 views
5

Ho qualche problema con la mappatura enum in NHibernate fluente. So che questa domanda è stata posta molte volte ma non ho trovato nessuna soluzione che funzionasse per me. Sono novizio in NHibernate e sembra che mi sia sfuggito qualcosa di semplice e stupido. Ecco il mio codice.Fluent Nhibernate Enum Mapping

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 enum tipo

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

ma quando provo a salvare, Postgres genera questa

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

qualsiasi suggerimento?

risposta

6

Ecco un esempio funzionante di configurazione di nibernato per memorizzare il 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(); 
      } 
     } 

    } 
} 

In tal caso viene memorizzato come stringhe nel database. Se si desidera essere salvato come numeri interi, è necessario modificare la mappatura della proprietà campo Enum al seguente:

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

soluzione u funziona solo se il tipo di colonna della tabella è intero ma ho bisogno personalizzato tipo enum Postgres, così ho appena ricevuto il un'altra eccezione: "colonna 'stato' è di tipo content.enum_publication_status ma l'espressione è di tipo int Eger "ma grazie comunque. Penso di aver bisogno di cambiare tipo di colonna e di dimenticarlo :) – maxs87

0

Perché stai creando tipi di enumerazione in corso? non è un incubo di manutenzione? Che aspetto ha la tua configurazione? Hai già provato a utilizzare le convenzioni discusse here? Sembra un semplice errore di trasmissione, quindi considera l'utilizzo di CustomType()/CustomSQLType() all'interno della mappatura.

0

Basta aggiungere questa classe per il vostro progetto:

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

Quindi, è possibile utilizzare:

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

puoi dare un esempio di selezione con un particolare 'PublicationStatus'? – heyNow

Problemi correlati