2009-04-20 13 views
5

Tengo una clase, Orden, que insisto en una base de datos utilizando NHibernate. Hay una carpeta más abajo en la aplicación web que contiene un objeto que hereda de Order, para nuestros propósitos, podemos llamarlo CustomOrder. Uso CustomOrder para colocar algunas propiedades en el objeto Order para propósitos de UI. Las propiedades en realidad no tienen que guardarse en la base de datos.NHibernate Clase heredada pero no es necesario que persista

Cuando paso la clase CustomOrder a mi método genérico salvar lo que sólo se necesita en un objeto Order, NHibernate se queja:

Desconocido clase de entidad: CustomOrder.

No es necesario que conserve los campos personalizados en la base de datos, pero me gustaría mantener esta estructura de herencia. ¿Estoy pensando en términos equivocados o haciendo algo que no debería estar haciendo?

Guardar código

public object Save(Order obj, object userID) { 
     Order o = (Order)obj; 
     ISession session = NHibernateHelper.GetCurrentSession(); 
     ITransaction tx = session.BeginTransaction(); 

     session.Save(o); 

Después de que el caso en la primera línea del método, .NET todavía lo identifica como CustomerOrder.

Respuesta

2
  1. No se puede cambiar el tipo de una instancia en .NET. No hay fundición o lo que sea que lo hace posible.
  2. Al cargar la instancia desde la base de datos, NHibernate desea crear el mismo tipo que almacenó. Es por eso que quiere una asignación para CustomOrder.

Como quiera que lo implemente: debe crear una nueva instancia de pedido.

// get the CustomOrder from somewhere 
CustomOrder customOrder; 
// create an instance of Order and store it. 
session.Save(customOrder.GetOrder()); 


class CustomOrder 
{ 

    // just one of many ways: a method on the CustomOrder to create 
    // instance of Order 
    public GetOrder() 
    { 
     return new Order() 
     { 
      property1 = this.property1, 
      property2 = this.property2, 
      property3 = this.property3 
     } 
    } 
} 

Puede usar Reflection para hacer esto automáticamente. O echa un vistazo a MemberwiseClone().

+0

+1 esto es exactamente lo que iba a sugerir (y la única manera de lograr esto). –

0

Ha pasado un tiempo, pero creo que debería poder especificar que la clase derivada debe persistir como un objeto de la clase base en el archivo de asignación de hibernación.

+0

¿Hay alguna solución para tener que proporcionar un discriminador para una subclase? – Josh

Cuestiones relacionadas