2008-11-18 5 views
5

¿Cómo es posible establecer algunos valores de columna especiales cuando las entidades de actualización/inserción via NHibernate sin extender las clases de dominio con propiedades especiales?Implementación de NHternate IInterceptor (agregue propiedades a la tabla DB que la clase de dominio original no tiene)

Por ejemplo: en mi caso me gustaría obtener un objeto y justo antes de actualizar/insertar db agregue a ese objeto información adicional (como identificación de usuario o nombre de computadora) usando IInterceptor. En otras palabras, me gustaría agregar algunas columnas a DB Table sin especificar nuevas propiedades en la clase del objeto original. ¿Tengo que configurar/cambiar/agregar a mi Object.hbm.xml o App.config en ese caso?

El problema es que no puedo cambiar mis objetos originales y clases base. Así que tengo que averiguar si es posible agregar información a la tabla DB sin cambiar los objetos originales (incluso sin heredar de ninguna clase base)

Ejemplo:

objeto original tiene: FirstName ,LastName,Birthday,Address properties

Customer.hbm.xml tiene:

<property name="FirstName" column="FirstName" type="string" not-null="true" length="64" /> 
<property name="LastName" column="LastName" type="string" not-null="true" length="64" /> 
<property name="Birthday" column="Birthday" type="DateTime" not-null="true" /> 
<property name="Address" column="Address" type="string" not-null="true" /> 

Mi clase interceptor tiene método:

public bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types) 

en ese momento o incluso tal vez antes de guardar tengo que añadir a la tabla de clientes DB 2 columnas adicionales (nombre del equipo y nombre de usuario, por ejemplo) que propertyNames[] y state[] parámetros don' t tenerlos desde el principio, por lo que debe hacerse sobre la marcha.

MY DB Customer table tiene todas las columnas que he descrito anteriormente.

Gracias.

Respuesta

1

No lo he intentado, pero debería poder agregar las propiedades dinámicas a la Configuración antes de la creación de fábrica. Entonces puedes poblar esos valores en tu interceptor.

Por ejemplo, recupere la clase PersistentClass correspondiente de config.ClassMappings, luego agregue sus propiedades a la misma.

private void AddProperty(
     PersistentClass pc, 
     string propertyName, 
     string columnName, 
     IType dataType) 
    { 
     SimpleValue val = new SimpleValue(pc.Table); 
     Column col = new Column(dataType, 0); 
     col.Name = columnName; 
     val.AddColumn(col); 
     val.Type = dataType; 
     Property prop = new Property(val); 
     prop.IsUpdateable = true; 
     prop.Name = propertyName; 
     prop.PropertyAccessorName = "nosetter.camelcase"; 
     prop.Cascade = "none"; 
     pc.AddNewProperty(prop); 
    } 
Cuestiones relacionadas