NHibernate更新未持久化
我有两个这样声明的实体(非常简化):NHibernate更新未持久化,hibernate,nhibernate,nhibernate-mapping,hibernate-mapping,Hibernate,Nhibernate,Nhibernate Mapping,Hibernate Mapping,我有两个这样声明的实体(非常简化): 公共测试1{ 公共虚拟整数Id{get;set;} 公共虚拟ICollection子项{get;set;} } 公开测试2{ 公共虚拟整数Id{get;set;} 公共虚拟Test1父级{get;set;} 公共虚拟字符串名称{get;set;} } 现在我想更改(第一个)子级的name属性: var entities=Session.CreateCriteria().List(); var tx=Session.BeginTransaction(
公共测试1{
公共虚拟整数Id{get;set;}
公共虚拟ICollection子项{get;set;}
}
公开测试2{
公共虚拟整数Id{get;set;}
公共虚拟Test1父级{get;set;}
公共虚拟字符串名称{get;set;}
}
现在我想更改(第一个)子级的name属性:
var entities=Session.CreateCriteria().List();
var tx=Session.BeginTransaction();
foreach(实体中的Test1实体)
{
entity.Childs.First().Name=“blablabla”;
更新(实体);
}
tx.Commit();
但这不起作用。我可以在NhProf中看到,事务已经启动,sql被激发用于获取父记录,另一个被激发用于获取子记录。但没有为更新name属性而激发sql。我做错了什么?在阅读文档时,我尝试了不同的方法,但没有成功
非常感谢
ISession.Update在上述场景中不应调用。您正在使用附着的图元,因此会自动跟踪更改。不需要显式调用Update
如需进一步解释,请阅读此处:
它还取决于刷新模式在更新发生时的设置。在上面的示例中,尝试显式地将flushmode设置为Commit。以下是flushmodes表:
自动
ISession有时会在查询执行之前刷新,以确保查询永远不会返回过时状态。这是默认的刷新模式
提交
调用Transaction.Commit()时,ISession将被刷新
从不
除非应用程序显式调用Flush(),否则永远不会刷新ISession。此模式对于只读事务非常有效
所以你会得到这样的结果:
Session.FlushMode = FlushMode.Commit;
var entities = Session.CreateCriteria<Test1>().List<Test1>();
using(var tx = Session.BeginTransaction())
{
foreach (Test1 entity in entities)
{
entity.Childs.First().Name = "blabla";
Session.Update(entity);
}
tx.Commit();
}
Session.FlushMode=FlushMode.Commit;
var entities=Session.CreateCriteria().List();
使用(var tx=Session.BeginTransaction())
{
foreach(实体中的Test1实体)
{
entity.Childs.First().Name=“blablabla”;
更新(实体);
}
tx.Commit();
}
我遇到了一个类似的问题,通过删除inverse
属性解决了这个问题。您有inverse=true
。尝试将其更改为false
尝试在foreach之后调用session.flush…更改不是用commit刷新的吗?我也曾尝试在foreach之后刷新,但没有成功。
var entities = Session.CreateCriteria<Test1>().List<Test1>();
var tx = Session.BeginTransaction();
foreach (Test1 entity in entities)
{
entity.Childs.First().Name = "blabla";
Session.Update(entity);
}
tx.Commit();
Session.FlushMode = FlushMode.Commit;
var entities = Session.CreateCriteria<Test1>().List<Test1>();
using(var tx = Session.BeginTransaction())
{
foreach (Test1 entity in entities)
{
entity.Childs.First().Name = "blabla";
Session.Update(entity);
}
tx.Commit();
}