¿Cómo hacer referencia a enum valores dentro de la especificación de mapeo fórmula nhibernate?

StackOverflow https://stackoverflow.com/questions/2435758

Pregunta

Tengo dos tipos de entidades:

  • RunContainer tipo de entidad matriz
  • Ejecutar niño tipo de entidad

Run tiene un estado de propiedad, que es de tipo RunStatus, así:

public enum RunStatus
{
  Created,
  Starting,
  // ...
}
public class Run
{
  public int ContainerId { get; private set; }
  // ...
  public RunStatus Status { get; private set; }
}

RunContainer tiene un ActiveRunCount propiedad calculada, así:

public class RunContainer
{
  public int Id { get; private set; }
  // ...
  public int ActiveRunCount { get; private set; }
}

En el mapeo de la propiedad RunContainer.ActiveRunCount, utilizo la especificación fórmula así:

<property name="ActiveRunCount" formula="(select count(r.Id) from Run r where r.ContainerId = Id and r.Status = 1)"/>

Mi problema es que me refiero a los valores de enumeración RunStatus en la fórmula por su respectivo valor numérico, en lugar del nombre simbólico apropiado. ¿Puede alguien decirme cómo puedo utilizar el nombre simbólico en su lugar?

Gracias.

¿Fue útil?

Solución

Mapas NHibernate enumeraciones a la representación de cadena si la columna SQL es un tipo de cadena, y este es el valor por defecto si se deja NHibernate generar el esquema.

así:

ALTER TABLE Run ALTER COLUMN Status varchar(20)

y en el mapeo

<class name="Run">
  <!- [...] -->
  <property name="Status"/>
</class>

Ahora la tabla de SQL contendrá una representación de cadena de la enumeración. La fórmula ahora puede preguntar para que:

<property name="ActiveRunCount" formula="
  (select count(r.Id) from Run r 
  where r.ContainerId=Id and r.Status='Active')"/>

(Si ya tiene datos en las tablas, se debe escribir una conversión lugar de la instrucción ALTER COLUMN desnudo).


Edición después de comentario:

Para generar el archivo de asignación y asegurarse de que tiene el valor de enumeración en la fórmula correcta, se puede usar FluentNhibernate . El mapeo de la propiedad ActiveRun se vería así:

Map(x => x.ActiveRunCount)
 .Formula(string.Format("(select count(r.Id) [...] and r.Status='{0}')",
   RunStatus.Active))

Si eso es lo que estabas buscando, también se puede mantener a los números enteros en las columnas y hacer esto:

Map(x => x.ActiveRunCount)
 .Formula(string.Format("(select count(r.Id) [...] and r.Status={0})",
   (int)RunStatus.Active))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top