我正在尝试与来自 3rd 方 dll 的实体建立关联。由于某些原因,我必须使用StatelessSession
. 使用StatefullSession
它,但不适用于无状态。这个想法是允许第 3 方添加一个表并在我查询主表时获取其数据。
我有三个项目:我的主项目、带IExtender
接口的模型项目和带类的第 3 方项目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; }
}
第 3 方 hbm:
<?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>
第 3 方项目将其 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"
从包中取出,我会收到此错误(无论该集合是否是虚拟的):
Initializing[MyProject.Data#1] - 无法延迟初始化角色集合:MyProject.Data.Extenders,没有会话或会话已关闭
编辑:我将我的 NHibernate 版本升级到最新版本,现在当我使用包时它可以工作,但是当我使用具有一对一关系的单个实体时,它始终为空。
顺便说一句,无论是否有错误,我在最终的 sql 查询中都看到该Extender
表正在正确连接。
谢谢你的帮助。