2009-04-20 2 views
5

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

Когда я прохожу класс CustomOrder к моему родовому сохранить метод, который просто принимает в объекте заказа, 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
  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

+1 это именно то, что я собирался предложить (и единственный способ сделать это). –

0

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

+0

Есть ли обходной путь для предоставления дискриминатора для подкласса? – Josh

Смежные вопросы