我有Session.Update()
更新行的状态。下一行代码是Session.CreateSqlQuery()
,其中包含更复杂的更新查询。它们都在交易中,如下所示:
private void RemoveReferences(Person obj)
{
//Session is ISession
//Person contains multiple Activity, that can contains multiple DetailedActivity.
using (var tx = Session.BeginTransaction())
{
foreach (var act in obj.Activities)
{
var det = Session.QueryOver<DetailedActivity>()
.Where(w => w.Activity.CdActivity == act.CdActivity)
.Take(1).SingleOrDefault();
//Null validation removed...
det.Date = null;
det.Activity.Stage = 2; //Example of value being updated.
Session.Update(det.Activity);
Session.Update(det);
}
Session.Flush();
//More code removed...
//The next code is blind to any updated value from the code above.
//For example, the value Stage still keeps its old value
//if I try to get if from a CreateSqlQuery.
//Tries to remove the Person reference from the Activity.
Session.CreateSQLQuery("Update activity ac " +
"Set cd_person = null " +
"From det_activity da " +
"Where ac.cd_activity = da.cd_activity " +
"And ac.cd_person = :cdPerson " +
"And Coalesce(ac.stage, 1) = 2 " +
"And da.Date is null;")
.SetParameter("cdPerson", obj.CdPerson).ExecuteUpdate();
tx.Commit();
//Try/catch removed for brevity;
}
这段代码是我正在使用的简化版本,但是有两个基本的代码块。
对于CreateSqlQuery
来电,之前Session.Update()
更新的值未被“看到”。我尝试使用activity
获取CreateSqlQuery
行,但仍会返回旧值。
为什么CreateSqlQuery
没有看到更新后的值?
有没有办法让CreateSqlQuery
看到更新后的值?
答案 0 :(得分:1)
如果我读得正确,你似乎误解了&#34;更新()&#34;确实。您可能需要参考参考文档:http://nhibernate.info/doc/nhibernate-reference/manipulatingdata.html#manipulatingdata-updating
当您使用刚加载的实例并希望在同一会话内更新时,正如您在此处所做的那样,只需修改对象即可。在NHibernate的脏检查和刷新阶段,更改将被发送到数据库。
Save(),Update()和SaveOrUpdate()用于新对象,或用于您希望附加到新会话的上一个会话中加载的对象。他们告诉NHibernate会话&#34;请注册这个对象以便稍后进行脏检查&#34; (在某些情况下,由于技术原因,Save()可能会立即触发INSERT,但这是副作用而非承诺)。
但是,Update()应该没有任何损害(它应该是一个无操作),并且你也明确地调用Flush(),它应该将修改传输到数据库。
所以解释必须在其他地方......
此代码中Session
究竟是什么?你确定它是完全相同的会话实例吗?
如何映射类?有关刷新规则,只读属性等的任何内容吗?