Унаследованный класс NHibernate, но не нужно продолжать - PullRequest
5 голосов
/ 20 апреля 2009

У меня есть класс Order, который я сохраняю в базе данных, используя NHibernate. В веб-приложении есть папка, которая содержит объект, который наследуется от Order, для наших целей мы можем назвать его CustomOrder. Я использую CustomOrder, чтобы поместить несколько свойств в объект Order для целей пользовательского интерфейса. Свойства на самом деле не должны быть сохранены в базе данных.

Когда я передаю класс 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 ]

2 голосов
/ 20 апреля 2009
  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
        }
    }
}

Вы можете использовать Reflection, чтобы сделать это автоматически. Или взгляните на MemberwiseClone () .

0 голосов
/ 20 апреля 2009

Это было давно, но я считаю, что вы должны быть в состоянии указать, что производный класс должен сохраняться как объект базового класса в файле отображения гибернации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...