2010-05-14 2 views
2

У меня есть две разные модели данных, которые сопоставляются с одним и тем же объектом. Мне нужно было создать второй объект под названием ParkedCar, который идентичен Car (и, следовательно, наследуется от него), чтобы остановить nhibernate, жалуясь на то, что для одного и того же объекта существуют два сопоставления.Использование nHibernate для сопоставления двух разных моделей данных с одной моделью объекта

public class Car 
{ 
    protected Car() 
    { 
     IsParked = false; 
    } 

    public virtual int Id { get; set; } 
    public bool IsParked { get; internal set; } 
} 

public class ParkedCar : Car 
{ 
     public ParkedCar() 
     { 
      IsParked = true; 
     } 
     //no additional properties to car, merely exists to support mapping and signify the       car is parked 
} 

Единственная проблема в том, что, когда я пришел, чтобы получить автомобиль из базы данных, используя критерии API следующим образом:

SessionProvider.OpenSession.Session.CreateCriteria<Car>() 
        .Add(Restrictions.Eq("Id", 123)) 
        .List<Car>(); 

Запрос возвращает автомобилей Сущности, которые от модели ParkedCar данных. Его как будто nhibernate по умолчанию относится к специализированному объекту. И сопоставления вызывающе выглядят в нужном месте:

<class name="Car" xmlns="urn:nhibernate-mapping-2.2" table="tblCar"> 

<class name="ParkedCar" xmlns="urn:nhibernate-mapping-2.2" table="tblParkedCar" > 

Как это остановить?

+0

Это не имеет смысла для меня, почему вы хотите, чтобы отделить таблицы в первую очередь. Не могли бы вы просто использовать NHibernate для запроса автомобилей, где '' IsParked = true? '? – Doug

+0

Потребовалось слишком много времени, чтобы объяснить, почему это должно быть так. В основном в приложении, которое мы создаем, определенные объекты должны храниться по-разному в определенное время, но мы хотим оградить приложение от этого. – Dan

+0

Но вы не защищаете свое приложение от него вообще. Ваше приложение должно знать, когда запрашивать автомобиль, или когда запрашивать ParkedCar, когда оба объекта обслуживают одну и ту же функцию. То, что я предлагаю, - это другая архитектура, облегчающая необходимость делать подобные вещи вообще. – Doug

ответ

3

Я думаю, вам нужно установить свойство полиморфизма на class mapping

<class "Car" polymorphism="explicit" ... 
+0

Спасибо! Надеюсь, это будет так просто. – Dan

0

С тех пор, как ParkedCar расширяет автомобиль, запрос на автомобиль будет возвращать как объекты Car, так и ParkedCar. Вы можете ограничить тип с помощью HQL, используя special class property, то есть from Car c where c.class = Car. Я не думаю, что вы можете сделать это с помощью API критериев.

В качестве альтернативы вы можете отфильтровать список после его получения, если это разумный размер.

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

  • Нет связанных вопросов^_^