【发布时间】:2013-06-01 07:24:19
【问题描述】:
我有一个非常简单的主子模型:
WorkflowEscalationPolicy。
WorkflowEscalations 可从WorkflowEscalationPolicy.Escalations 属性访问。
当我收到WorkflowEscalationPolicy 项目时,我想急切地获取升级。
我有一个获取所有升级策略的方法。我试过用这个:
IEnumerable<IWorkflowEscalationPolicy> results =
Session
.Query<WorkflowEscalationPolicy>()
.Fetch(x=>x.Escalations)
.Where(q=>q.ApplicationKey==applicationKey);
还有这个:
IEnumerable<IWorkflowEscalationPolicy> results =
Session
.CreateCriteria<WorkflowEscalationPolicy>()
.SetFetchMode("Escalations", FetchMode.Eager)
.List<WorkflowEscalationPolicy>();
要完成此操作,但两者都不起作用 - 因为子 Escalations 集合仍然为空。我知道数据库中有WorkflowEscalations。
我的映射文件:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="FB.SimpleWorkflow.NHibernate"
namespace="FB.SimpleWorkflow.NHibernate.Model" >
<class name="WorkflowEscalationPolicy" table="SW_WorkflowEscalationPolicy" >
<id name="Id">
<generator class="native" />
</id>
<property name="ApplicationKey" />
<property name="ActivityKey" />
<property name="InstanceKey" />
<property name="State" />
<property name="EscalateAfterSeconds" />
<property name="MaximumEscalationsPerTransition" />
<set name="Escalations" table="SW_WorkflowEscalation" cascade="all-delete-orphan" inverse="true">
<key column="WorkflowEscalationPolicyId" />
<one-to-many class="WorkflowEscalation" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="FB.SimpleWorkflow.NHibernate"
namespace="FB.SimpleWorkflow.NHibernate.Model" >
<class name="WorkflowEscalation" table="SW_WorkflowEscalation" >
<id name="Id">
<generator class="native" />
</id>
<property name="EscalatedTimeStamp" />
<property name="EscalatedByUserName" />
<property name="EscalatedOnHost" />
<many-to-one name="WorkflowEscalationPolicy" column="WorkflowEscalationPolicyID" />
<many-to-one name="WorkflowActivityInstanceTransition" column="WorkflowActivityInstanceTransitionId" />
</class>
</hibernate-mapping>
两者之间有什么区别,我在这里缺少什么?我以为NHibernate首先是指加载策略的映射文件?
NHibernate 是 v3.1
更新:2013 年 6 月 6 日
感谢@cremor 进一步调查...
我已经分析了查询执行的生成的 SQL,我得到了:
SELECT this_.Id as Id4_1_,
this_.ApplicationKey as Applicat2_4_1_,
this_.ActivityKey as Activity3_4_1_,
this_.InstanceKey as Instance4_4_1_,
this_.State as State4_1_,
this_.EscalateAfterSeconds as Escalate6_4_1_,
this_.MaximumEscalationsPerTransition as MaximumE7_4_1_,
escalation2_.WorkflowEscalationPolicyID as Workflow5_3_,
escalation2_.Id as Id3_,
escalation2_.Id as Id2_0_,
escalation2_.EscalatedTimeStamp as Escalate2_2_0_,
escalation2_.EscalatedByUserName as Escalate3_2_0_,
escalation2_.EscalatedOnHost as Escalate4_2_0_,
escalation2_.WorkflowEscalationPolicyID as Workflow5_2_0_,
escalation2_.WorkflowActivityInstanceTransitionID as Workflow6_2_0_
FROM SW_WorkflowEscalationPolicy this_
left outer join SW_WorkflowEscalation escalation2_ on this_.Id=escalation2_.WorkflowEscalationPolicyID
这是我所期望的。
这会生成正确的 SQL,在主 EscalationPolicy 记录的右侧有单个详细升级记录。因此,数据库很好,T-SQL 很好,因此在 NHibernate 内部存在误解。
【问题讨论】:
-
究竟是什么不起作用?急切加载仅意味着升级列表直接在 WorkflowEscalationPolicy 对象之后加载,并不意味着执行了某些连接。
-
抱歉,已添加说明。即使数据库中有记录,(WorkflowEscalation 的)Escalations 属性也是空的。也许这就是我不清楚的地方?但是,我以前看过这段代码!有些事情发生了变化,我接受我已经打破了它,但需要弄清楚如何:)
标签: nhibernate