0

我遇到了一个问题,代码看起来很简单,但是异常:

        DDS.Model.ATest atest = new DDS.Model.ATest();
        atest.AID = Guid.NewGuid();

        ISession session = SessionProvider.GetNewSession();
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(atest);

            int count = session.CreateQuery("from ATest").List().Count;
            //Above row throw a exception:
            //Batch update returned unexpected row count from update; actual row count: 0; expected: 1

            transaction.Commit();
        }
4

1 回答 1

1

您正在尝试在保存之前加载项目。先提交事务,然后执行查询。

DDS.Model.ATest atest = new DDS.Model.ATest();
//atest.AID = Guid.NewGuid(); // You should not assign IDs by yourself

ISession session = SessionProvider.GetNewSession();
using (ITransaction transaction = session.BeginTransaction())
{
    session.SaveOrUpdate(atest);
    transaction.Commit();
}

int count = session.CreateQuery("from ATest").List().Count;

但这似乎不是你的问题。我相信您已将 ID 映射为 Guid 或 Guid.comb。您不应将该值分配给 ID。NHibernate 会处理这个问题。

当您分配值并调用 session.SaveOrUpdate() 时,它将尝试进行更新,因为 ID 值不是Guid.Empty。更新方法将失败,并出现以下异常:批量更新从更新返回了意外的行数;实际行数:0;预期: 1,因为UPDATE ... WHERE AID = <some guid>将被执行。

于 2012-09-08T10:48:48.430 回答