Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate更新未持久化_Hibernate_Nhibernate_Nhibernate Mapping_Hibernate Mapping - Fatal编程技术网

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();
}