NHibernate继承了Class但不需要持久化

时间:2009-04-20 16:43:52

标签: asp.net nhibernate inheritance persistence

我有一个类Order,我使用NHibernate将其保存到数据库中。 Web应用程序中有一个文件夹,其中包含一个继承自Order的对象,出于我们的目的,我们可以将其称为CustomOrder。我使用CustomOrder将一些属性放在Order对象上以用于UI。实际上不必将属性保存到数据库中。

当我将CustomOrder类传递给只接受Order对象的泛型保存方法时,NHibernate会抱怨:

未知的实体类:CustomOrder。

我不需要将自定义字段持久保存到数据库中,但我想保留此继承结构。我是在想错误的做法还是做一些我不该做的事情?

保存代码

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

        session.Save(o);

在方法第一行的案例之后,.NET仍然将其标识为CustomerOrder。

2 个答案:

答案 0 :(得分:2)

  1. 您无法在.NET中更改实例的类型。没有任何转换或任何使其成为可能的内容。
  2. 从数据库加载实例时,NHibernate想要创建您存储的相同类型。这就是为什么它需要CustomOrder的映射。
  3. 您如何实现它:您需要创建一个新的Order实例。

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

    您可以使用Reflection自动执行此操作。 或者看看MemberwiseClone()

答案 1 :(得分:0)

已经有一段时间了,但我相信您应该能够指定派生类应该作为hibernate映射文件中基类的对象保存。