visual tutorial studio framework example descargar nhibernate enums persistence foreign-keys

tutorial - nhibernate visual studio 2017



Cómo persistir una enumeración usando NHibernate (6)

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

La asignación se ve así:

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

La propiedad del modelo se ve así:

public virtual OrganizationTypes OrganizationType { get; set; }

El Enum se ve así:

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

NHibernate lo resolverá automáticamente. ¿Por qué escribir más de lo que necesita ???

¿Hay alguna forma de persistir en una enumeración en DB utilizando NHibernate? Eso es tener una tabla de ambos, el código y el nombre de cada valor en la enumeración.

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


Estoy usando NHibernate 3.2, y esto funciona genial:

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

Sin embargo, no estoy seguro de cuándo se agregó el genérico EnumStringType.



Intenta 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 }


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 es exactamente 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.


Una solución fácil pero no tan hermosa:

Cree un campo entero con y establezca la asignación en el archivo de mapeo en el campo. Crea una propiedad pública que use el campo entero.

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