有人可以向我解释为什么会发生这种情况 - 我在客户端和项目之间有一对多的映射。
以下是相应映射文件中的两个关系:
客户端:
<!-- Relationship with project -->
<bag name="projects" cascade ="all-delete-orphan" lazy="false">
<key column="client_id" />
<one-to-many class="Project" ></one-to-many>
</bag>
项目:
<many-to-one name="client"
class="Client"
column="client_id"
cascade="all-delete-orphan"
fetch="join"
not-null="false"
lazy="false" />
以下是一个返回特定客户端的网络方法。
public Client RetrieveEqualsClient(string propertyName, object propertyValue)
{
Client c = new Client();
ConfigureNHibernate();
using (ISession session = m_SessionFactory.OpenSession())
{
ICriteria criteria = session.CreateCriteria(typeof(Client));
criteria.Add(Expression.Eq(propertyName, propertyValue));
c = criteria.List<Client>()[0];
return c;
}
}
我从我的aspx页面调用方法如下:
$.ajax
(
{
type: "post",
url: "NHibernateWebService.asmx/RetrieveEqualsClient",
data: "{id: " + id + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (result) { alert("Failure: " + result.statusText); },
success: function (result) { alert(result); }
}
)
这给了我一个例外:NHibernate LazyInitializationException:懒得初始化一个集合,没有关闭会话或会话,这里 - //这是在Client类
中public virtual IList<Project> projects
{
get { return c_projects ?? ( c_projects = new List<Project>()); }//Exception Occurs Here!
set { c_projects = value; }
}
我经历了有关此异常的各种问题,但无法使其正常工作。
答案 0 :(得分:1)
尝试为项目设置fetch="join"
:
<bag name="projects" cascade ="all-delete-orphan" fetch="join">
<key column="client_id" />
<one-to-many class="Project" ></one-to-many>
</bag>
答案 1 :(得分:1)
您获得的异常是由于您在ISession
的范围外尝试加载项目集时引起的。
这可能是因为,在序列化时,序列化程序会读取该属性,并且它发生在using
范围之外。
最好的办法是use a dto instead of serializing your POCO。
所以你的代码看起来像是:
using (ISession session = m_SessionFactory.OpenSession())
{
ICriteria criteria = session.CreateCriteria(typeof(Client));
criteria.Add(Expression.Eq(propertyName, propertyValue));
var list = criteria.List<Client>();
if (!list.Any())
return null;
return new ClientDTO(list[0]);
}
此外,我不确定从客户端获取属性名称时所做的动态查询 您正在UI代码和数据库之间建立强大的耦合(如果Id属性发生更改,这意味着您必须更改jQuery代码......)
如果您的客户确实要求使用Id的客户端,那么Get<Client>(id)
方法会更合适且不易出错。