NHibernate Proxy Создание - PullRequest
       1

NHibernate Proxy Создание

1 голос
/ 16 марта 2010

У меня есть структура классов, подобная следующей

class Container
{
    public virtual int Id { get; set; }
    public IList<Base> Bases { get; set; }
}

class Base
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

class EnemyBase : Base
{
    public virtual int EstimatedSize { get; set; }
}

class FriendlyBase : Base
{
    public virtual int ActualSize { get; set; }
}

Теперь, когда я спрашиваю сессию о конкретном контейнере, он обычно дает мне конкретные объекты EnemyBase и FriendlyBase в коллекции Bases. Затем я могу (если захочу) привести их к конкретным типам и сделать с ними что-то конкретное.

Однако иногда я получаю прокси класса "Base", который не может быть преобразован в конкретные типы. Один и тот же метод используется оба раза, за исключением того, что в случае, когда я получаю прокси-серверы, я добавил несколько связанных сущностей в сессию (подумайте, что дружеская база имеет коллекцию людей или что-то в этом роде).

Могу ли я как-нибудь помешать ему создать прокси-сервер и почему он решил сделать это в некоторых сценариях?

UPDATE

Отображения генерируются с помощью функции автоматического выбора в fluentnhibernate, но при экспорте выглядят примерно так

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Base" table="`Base`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="MyIdGenerator" />
    </id>
    <property name="Name" type="String">
      <column name="Name" />
    </property>

    <joined-subclass name="EnemyBase">
      <key>
        <column name="Id" />
      </key>
      <property name="EstimatedSize" type="Int">
        <column name="EstimatedSize" />
      </property>

    </joined-subclass>
    <joined-subclass name="FriendlyBase">
      <key>
        <column name="Id" />
      </key>
      <property name="ActualSize" type="Int">
        <column name="ActualSize" />
      </property>

    </joined-subclass>
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Container" table="`Container`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="MyIdGenerator" />
    </id>
    <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Bases" mutable="true">
      <key>
        <column name="ContainerId" />
      </key>
      <one-to-many class="Base" />
    </bag>  
  </class>
</hibernate-mapping>

UPDATE

Я сейчас сказал NH, чтобы никогда не лениво загружать все, что он автоматизирует, не идеально, если мне понадобится эта функция в будущем, но, похоже, она работает сейчас.

Ответы [ 2 ]

1 голос
/ 16 марта 2010

Насколько я понимаю, если вы используете myProxiedBase = Session.Load<Base>(myBase.Id), вы всегда получите прокси базового объекта. Если вы ХОТИТЕ объект EnemyBase, вы должны сделать еще один вызов Session.Load<EnemyBase<(myProxiedBase.Id).

Проверьте этот раздел главы 17 в Документах:

Это объясняет это немного лучше, чем я, и возможные обходные пути.

0 голосов
/ 16 марта 2010

Можете ли вы определить тип как абстрактный? Это, вероятно, приведет к ошибке, так как nHibernate пытается в любом случае, но может указать вам на «почему».

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