NHibernate更新多个瞬态对象异常:对的属性值进行脱水时出错

NHibernate更新多个瞬态对象异常:对的属性值进行脱水时出错,nhibernate,Nhibernate,我有一个要更新的瞬态对象列表,所有这些对象都来自同一个表 IList<MyObject> objectsToUpdate = GetObjectsToUpdate(); using (var session = GetSession()) using (var transaction = session.BeginTransaction()) { foreach (var obj in objectsToUpdate) { obj.Property =

我有一个要更新的瞬态对象列表,所有这些对象都来自同一个表

IList<MyObject> objectsToUpdate = GetObjectsToUpdate();
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
    foreach (var obj in objectsToUpdate)
    {
        obj.Property = "new value";
        session.Update(obj);
    }
    transaction.Commit(); //exception thrown here
}
IList objectsToUpdate=GetObjectsToUpdate();
使用(var session=GetSession())
使用(var transaction=session.BeginTransaction())
{
foreach(objectsToUpdate中的var obj)
{
obj.Property=“新值”;
更新会议(obj);
}
transaction.Commit();//此处引发异常
}
异常消息:对MyObject.property的属性值进行脱水时出错 内部异常消息:字符串值的长度超过映射/参数中配置的长度

异常消息没有真正意义,因为映射中没有长度配置,并且字符串在范围内

我可以通过以下方式解决此问题:

1) 调用session.Update(obj)后调用session.Flush()

IList objectsToUpdate=GetObjectsToUpdate();
使用(var session=GetSession())
使用(var transaction=session.BeginTransaction())
{
foreach(objectsToUpdate中的var obj)
{
obj.Property=“新值”;
更新会议(obj);
session.Flush();
}
Commit();
}

2) 调用session.Merge(obj),修改其属性,然后一次提交所有内容

IList<MyObject> objectsToUpdate = GetObjectsToUpdate();
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
    foreach (var obj in objectsToUpdate)
    {
        obj = session.Merge(obj);
        obj.Property = "new value";
    }
    transaction.Commit()
}
IList objectsToUpdate=GetObjectsToUpdate();
使用(var session=GetSession())
使用(var transaction=session.BeginTransaction())
{
foreach(objectsToUpdate中的var obj)
{
obj=session.Merge(obj);
obj.Property=“新值”;
}
Commit()事务
}
但是,我想了解为什么在多次更新调用后提交事务时抛出异常,而每次更新后都不刷新


有人能解释一下吗?

从映射生成表时,字符串属性的默认长度是255。为可以容纳长度大于255的字符串的属性指定更大的长度。

听起来您可能遇到了以下问题:


这是为Sybase报道的,但我无法复制。阅读对问题报告的评论。您使用的ADO.NET提供程序的(文件)版本是什么?

什么RDBMS?哪个NHibernate版本?Sybase ASE 15.5和NHibernate 3.3.2.4000表不是从映射生成的,字符串在定义的范围内。Sybase.AdoNet2.AseClient.dll文件版本1.15.186.0我将查看JIRA票据。听起来像是比测试时使用的旧版本,因此,这与我的理论是一致的,即这是他们的提供者的早期版本中的一个bug。请查看是否可以尝试更新版本,并在此处或错误报告中发表评论。
IList<MyObject> objectsToUpdate = GetObjectsToUpdate();
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
    foreach (var obj in objectsToUpdate)
    {
        obj = session.Merge(obj);
        obj.Property = "new value";
    }
    transaction.Commit()
}