Сбой инициализации связанного объекта или коллекции с помощью сеанса без сохранения состояния в NHibernate

Я пытаюсь создать ассоциацию с юридическим лицом из сторонней библиотеки dll. По некоторым причинам я должен использовать StatelessSession, С StatefullSession это работает, но не с лицами без гражданства. Идея состоит в том, чтобы позволить третьей стороне добавлять таблицу и получать ее данные, когда я запрашиваю основную таблицу.

У меня есть три проекта: мой основной проект, модельный проект с IExtender интерфейс и сторонний проект с Extender класс (на который не ссылается основной проект).

Моя схема данных:

Table Data
   Id INT identity,
   more fields...

Table Extender
   Id INT PK, FK from Data
   Name NVARCHAR
   more fields...

Код модели проекта:

public interface IExtender
{
    int Id { get; set; }
}

Основной код проекта:

public class Data
{
    public virtual int Id { get; set; }
    public IExtender Extender { get; set; }
    //public IList<IExtender> Extenders { get; set; }
}

Основной проект HBM:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  namespace="..." assembly="..." auto-import="true">

<class name="Data" table="Data" lazy="false">
    <id name="Id" column="Id" type="int" >
      <generator class="identity" />
    </id>
    <one-to-one name="Extender" foreign-key="Id" 
           class="Model.IExtender, Model" lazy="false"/>

<!--<bag name="Extenders" cascade="all" inverse="true" lazy="false">
  <key column="Id" />
  <one-to-many class="Model.IExtender, Model"/>
</bag>-->

</class>
</hibernate-mapping>

Сторонний проект:

public class Extender : IExtender
{
    public virtual int Id { get; set; }
    public string Name { get; set; }
}

Сторонний хбм:

<?xml version="1.0" encoding="utf-8"?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model" assembly="Model" auto-import="true">

  <class name="IExtender" table="IExtender" lazy="false" abstract="true">

    <id name="Id" column="Id" type="int" >
      <generator class="assigned" />
    </id>

    <union-subclass table="Extender" name="Extension.Extender, Extension" lazy="false">
      <property name="Name" column="Name" not-null="true" type="String" />
    </union-subclass>

  </class>
</hibernate-mapping>

Сторонний проект помещает свою DLL в основную папку bin проекта.

Теперь мой код для получения данных выглядит так:

var sessionFactory = new Configuration().Configure()
   .AddAssembly(Assembly.LoadFile(System.Environment.CurrentDirectory + @"\Extender.dll"))
   .AddAssembly(Assembly.GetExecutingAssembly())
   .BuildSessionFactory();

var session = sessionFactory.OpenStatelessSession();
var criteria = session.CreateCriteria<Data>();
var data = criteria.List<Data>().ToList();
Console.WriteLine(data.First().Extender.Id); // fails because Extender is null

Если я использую StatefullSession, он отлично работает с одной сущностью или сумкой. Если я использую StatelessSession и вместо сумки (и списка, как прокомментированные строки выше), я получаю сообщение об ошибке:

коллекции не могут быть получены сеансом без сохранения состояния

Если я удалю lazy="false" из сумки я получаю эту ошибку (независимо от того, виртуальная коллекция или нет):

При инициализации [MyProject.Data#1] не удалось лениво инициализировать коллекцию ролей: MyProject.Data.Extenders, ни один сеанс или сеанс не был закрыт

РЕДАКТИРОВАТЬ: Я обновил мою версию NHibernate до последней версии, и теперь она работает, когда я использую сумку, но когда я использую одну сущность с отношением один к одному, она всегда равна нулю.

Кстати, независимо от того, есть ли ошибка или нет, я вижу в конечном запросе SQL, что Extender стол соединяется правильно.

Спасибо за вашу помощь.

0 ответов

Другие вопросы по тегам