2010-07-22 11 views
8

Actualmente tengo un sistema heredado que usa SP exclusivamente para acceder a la base de datos. Mi objeto de dominio es como la siguiente:NHibernate, cómo asignar una propiedad a una subselección

public class User : EntityBase 
{ 
    public virtual string Name {get;set;} 
    public virtual string CreatedBy {get;set;} 
    public virtual DateTime CreatedDate {get;set;} 
} 

El SP tengo que mapea esta era la siguiente:

CREATE PROCEDURE getUser 
{ 
    @ID int 
} 
select 
    Name 
    ,(SELECT TOP 1 UserName FROM AuditTrail WHERE EntityID = [User].[ID] AND EntityName = 'User' AND AuditActionID = 1 ORDER BY DateStamp) AS CreatedBy 
    ,(SELECT TOP 1 DateStamp FROM AuditTrail WHERE EntityID = [User].[ID] AND EntityName = 'User' AND AuditActionID = 1 ORDER BY DateStamp) AS CreatedDate 
    FROM [User] 
    WHERE [User].ID = @ID 

Por lo tanto, como se puede ver, la información de auditoría se separa de la propia entidad en la base de datos y CreatedBy/CreatedOn (y ModifiedBy/ModifiedOn) se almacenan en una tabla separada llamada AuditTrail. el campo AuditActionID en la tabla especifica si se trata de una creación/actualización.

¿Cómo puedo configurar este mapeo con NHibernate? Busqué en JOIN, pero no me da la opción de restringir por los valores adicionales (y una combinación no es lo que quiero).

Además, si esto es posible en Fluent NHibernate, eso es una ventaja, pero estoy de acuerdo con la configuración de asignación de NHibernate estándar, si eso me lleva allí.

ACTUALIZACIÓN:

he encontrado una manera de hacer esto, pero no soy un fan. Configuré una SQLQuery que lee los datos y los asigna de nuevo a un objeto. Funciona, pero me encantaría hacerlo a través del mapeo. ¿Es posible incluso porque los "valores" de la base de datos a la que estoy mapeando son una subselección y no editables?

Solución:

Gracias a la punta de Diego, esta era la solución final que encontré (usando Fluido NHibernate, en mi archivo ClassMap):

Map(x => x.CreatedBy).Formula("(SELECT TOP 1 AuditTrail.UserName FROM AuditTrail WHERE AuditTrail.EntityID = [ID] AND AuditTrail.EntityName = 'User' AND AuditTrail.AuditActionID = 1 ORDER BY AuditTrail.DateStamp)"); 
Map(x => x.CreatedDate).Formula("(SELECT TOP 1 AuditTrail.DateStamp FROM AuditTrail WHERE AuditTrail.EntityID = [ID] AND AuditTrail.EntityName = 'User' AND AuditTrail.AuditActionID = 1 ORDER BY AuditTrail.DateStamp)"); 

Gracias, M

Respuesta

7

Puede especificar la cláusula de selección como formula para su propiedad.

Cuestiones relacionadas