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

Jos*_*osh 5 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);
Run Code Online (Sandbox Code Playgroud)

在方法的第一行中的情况之后,.NET仍然将其标识为CustomerOrder.

Ste*_*ger 2

  1. 您无法更改 .NET 中实例的类型。没有演员阵容或任何使之成为可能的东西。
  2. 当从数据库加载实例时,NHibernate 希望创建与您存储的相同类型。这就是为什么它需要 CustomOrder 的映射。

无论您如何实现它:您都需要创建一个新的 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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