asp.net - NHibernate 继承类但无需持久化

标签 asp.net nhibernate inheritance persistence

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

当我将 CustomOrder 类传递给只接收 Order 对象的通用 save 方法时,NHibernate 会提示:

未知实体类:CustomOrder。

我不需要将自定义字段持久化到数据库,但我想保留这种继承结构。我是在用错误的方式思考还是在做我不应该做的事情?

保存代码

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

        session.Save(o);

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

最佳答案

  • 您不能在 .NET 中更改实例的类型。 没有类型转换或任何使它成为可能的东西。
  • 当从数据库加载实例时,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
            }
        }
    }
    

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

    关于asp.net - NHibernate 继承类但无需持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769107/

    相关文章:

    asp.net - 隐藏 Kendo UI DatePicker 文本框

    c# - 执行文件上传时出错

    nhibernate - 如何在 HQL 中使用 ROW_NUMBER()?

    c# - 具有复合索引的 Nhibernate Map 映射

    c++ - 将派生类的构造函数中的项插入基类的私有(private) std::vector 的最佳方法?

    javascript - AJAX 可访问的长时间运行的服务任务在启用 ASP.NET 兼容性/ session 的环境中阻止后续的 AJAX 服务请求

    javascript - 事件加载两次

    c# - 带左自连接的 NHibernate QueryOver

    java - 参数化 Maven 多模块构建

    CSS 类似乎没有正确继承/覆盖属性