C# 初始化关联实体或集合失败,NHibernate中存在无状态会话

C# 初始化关联实体或集合失败,NHibernate中存在无状态会话,c#,nhibernate,stateless-session,C#,Nhibernate,Stateless Session,我正在尝试与第三方dll中的实体建立关联。由于某些原因,我不得不使用无状态会话。使用StatefullSession它可以工作,但不能使用无状态会话。其想法是允许第三方添加一个表,并在我查询主表时获取其数据 我有三个项目:我的主项目、带有IExtender界面的模型项目和带有Extender类的第三方项目(主项目未引用) 我的数据模式: Table Data Id INT identity, more fields... Table Extender Id INT PK, F

我正在尝试与第三方dll中的实体建立关联。由于某些原因,我不得不使用
无状态会话
。使用
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; }
}
<?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>
模型项目代码:

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; }
}
<?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>
主要项目代码:

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; }
}
<?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>
第三方hbm:

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; }
}
<?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
var sessionFactory=new Configuration().Configure()
.AddAssembly(Assembly.LoadFile(System.Environment.CurrentDirectory+@“\Extender.dll”))
.AddAssembly(Assembly.getExecutionGassembly())
.BuildSessionFactory();
var session=sessionFactory.openstatesession();
var-criteria=session.CreateCriteria();
var data=criteria.List().ToList();
Console.WriteLine(data.First().Extender.Id);//由于扩展程序为空,因此失败
如果我使用的是
StatefullSession
,它可以很好地处理单个实体或包。如果我使用
无状态会话
和一个包(以及上面注释行的列表),我会得到一个错误:

集合不能由无状态会话获取

如果我从包中删除了
lazy=“false”
,我会得到这个错误(无论收集是否是虚拟的):

初始化[MyProject.Data#1]-未能延迟初始化 角色集合:MyProject.Data.Extender,无会话或会话 关门了

编辑: 我将我的NHibernate版本升级到最新版本,现在它在我使用包时工作,但当我使用一对一关系的单个实体时,它总是空的。

顺便说一句,不管是否有错误,我在最后一个sql查询中看到
Extender
表被正确连接

谢谢你的帮助