2008-11-02 12 views
52

¿Hay alguna manera de persistir una enumeración en la base de datos usando NHibernate? Eso es tener una tabla de ambos, el código y el nombre de cada valor en la enumeración.Cómo persistir una enumeración usando NHibernate

Quiero mantener la enumeración sin una entidad, pero todavía tengo una clave foránea (la representación int de la enumeración) de todas las otras entidades de referencia a la tabla de la enumeración.

+0

¿Alguna de estas respuestas resolvió su problema? – UpTheCreek

+0

@Sosh, no, para las enumeraciones importantes he rodado una entidad y para las demás acabo de utilizar el valor int. –

Respuesta

0

Hasta donde yo sé, esto no es posible por defecto. Sin embargo, Google muestra varios resultados interesantes en NHibernate Enum. Una de las formas en que probablemente probaría es Oran Dennison's Generic NHibernate Enum String Mapping, o, si puede modificar el Enum, Persisiting Described Enums como se describe en NHibernate Forge.

+0

Gracias, pero esto se refiere a la cadena de la enumeración, donde quiero tener una clave externa a la representación int en sí. –

6

Una solución tan hermoso fácil, pero no:

Crear un campo entero con y configurar el mapeo en el archivo de asignación para el campo. Crea una propiedad pública que usa el campo entero.

private int myField; 
public virtual MyEnum MyProperty 
{ 
    get { return (MyEnum)myField; } 
    set { myField = value; } 
} 
13

Puede usar el tipo de enumeración directamente: http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx. Si su tipo subyacente es una cadena, debería usar la representación de cadena, si es numérica, solo usará la representación numérica.

Pero la redacción de su pregunta parece que está buscando algo diferente, no del todo una enumeración. Parece que quiere una tabla de búsqueda sin crear una clase de entidad separada. Sin embargo, no creo que esto pueda hacerse sin crear una clase de entidad separada.

+1

Ese enlace no parece funcionar. Éste debería: http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-I-You-Mean-Enum.aspx – UpTheCreek

+0

Gracias, enlace de enlace actualizado. –

+8

Todavía no funciona para mí. – AlfeG

2

Pruebe a usar un patrón de estrategia. Uou puede poner la lógica en sus clases internas. Utilizo esto bastante espcialmente cuando hay una lógica que debe estar contenida en la "enumeración". Por ejemplo, el código siguiente tiene el resumen IsReadyForSubmission() que luego se implementa en cada una de las subclases anidadas (solo se muestra una). HTH

[Serializable] 
public abstract partial class TimesheetStatus : IHasIdentity<int> 
{ 
     public static readonly TimesheetStatus NotEntered = new NotEnteredTimesheetStatus(); 
     public static readonly TimesheetStatus Draft = new DraftTimesheetStatus(); 
     public static readonly TimesheetStatus Submitted = new SubmittedTimesheetStatus(); 
     //etc 

     public abstract int Id { get; protected set; } 
     public abstract string Description { get; protected set; } 
     public abstract bool IsReadyForSubmission(); 

     protected class NotEnteredTimesheetStatus: TimesheetStatus 
     { 
      private const string DESCRIPTION = "NotEntered"; 
      private const int ID = 0; 
      public override int Id 
      { 
       get { return ID; } 
       protected set { if (value != ID)throw new InvalidOperationException("ID for NotEnteredTimesheetStatus must be " + ID); } 
      } 

      public override string Description 
      { 
       get { return DESCRIPTION; } 
       protected set { if (value != DESCRIPTION)throw new InvalidOperationException("The description for NotEnteredTimesheetStatus must be " + DESCRIPTION); } 
      } 
      public override bool IsReadyForSubmission() 
      { 
       return false; 
      } 

     } 
     //etc 
} 
105

¿Por qué están complicando esto? Es realmente simple.

El mapeo se parece a esto:

<property name="OrganizationType"></property> 

La propiedad de modelo se parece a esto:

public virtual OrganizationTypes OrganizationType { get; set; } 

La enumeración es el siguiente:

public enum OrganizationTypes 
{ 
    NonProfit = 1, 
    ForProfit = 2 
} 

NHibernate le calculará automáticamente todo fuera. ¿Por qué escribir más de lo que necesita ???

+0

No estoy tan familiarizado con Hibernate, así que no puedo entender tu publicación. ¿Puedes explicar qué es la "propiedad modelo"? ¿Dónde está esto definido? –

+11

No entiendo por qué su respuesta no recibió más toneladas. Usted proporciona la respuesta en código claro que es fácil de entender. –

+5

Esto no funciona en nHibernate 2.1 ya que causa efecto fantasma: http://stackoverflow.com/questions/3247188/nhibernate-updates-unchaged-records – brainimus

3

estoy usando NHibernate 3.2, y esto funciona muy bien:

type="NHibernate.Type.EnumStringType`1[[enum_full_type_name, enum_assembly]], NHibernate" 

No sé cuando consiguió agregó el EnumStringType genérica, sin embargo.

Cuestiones relacionadas