Таблица nhibernate для каждой стратегии подкласса при получении объектов - PullRequest
0 голосов
/ 08 января 2011

Я работаю над веб-приложением ASP.NET, использующим NHibernate, и заметил кое-что забавное.
Итак, у меня есть объект Document, который я бы превратил в абстрактный класс, и две конкретные реализации Document1 и Document2.Я попытался написать сопоставления для них, применяя стратегию таблицы на подкласс, как описано в документации ( текст ссылки ):

    <class name="Document" abstract="true">

        <id name="Id">
          <generator class="identity"/>
        </id>
        ...
    <class>

  <joined-subclass
    name="Document1"
    extends="Document" >

    <key column="ParentId"/>
    ...
  </joined-subclass>

  <joined-subclass
    name="Document2"
    extends="Document" >

    <key column="ParentId"/>
    ...
  </joined-subclass>

Теперь вот так я получаю объекты изсеанс в моем приложении:

public TEntity GetById<TEntity>(object id) {
    return Session.Get<TEntity>(id);
}  

Теперь моя проблема в том, что когда я делаю:

GetById<Document>(1)

например, я не получаю объект Document, я получаю объект типа Document1или Document2 в зависимости от типа объекта.

Я попытался использовать таблицу на подкласс со стратегией дискриминаторов, как упомянуто в документации (ссылка выше), и я установил join = select и lazy = false для абстрактного объекта, чтобы он возвращал объект типаДокумент, но ничего не сработало.

Код работает, но он не выглядит правильным.У меня есть соединение слева, где я не смог бы его использовать.Разве нет способа просто получить абстрактный объект или nhibernate фактически создает экземпляры возвращаемых объектов, которые сделали бы это невозможным?Возможно ли это?

У меня такое ощущение, что я получаю больше информации, чем мне нужно.

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Вы никогда не получите абстрактный класс, потому что весь смысл абстрактного класса в том, что вы не можете создать его экземпляр. Кроме того, ваш код все равно вернет только остальную часть вашего документа. Так что я не уверен, в чем проблема на самом деле.

0 голосов
/ 09 января 2011

Невозможно получить экземпляр Document1 или Document2, который заполняет только те свойства, которые определены в абстрактном классе.В .NET вы всегда работаете с экземпляром конкретного класса, даже если тип объявлен как интерфейс или абстрактный класс.

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