插入实体后NHibernate"null identifier"异常

gil*_*s27 5 nhibernate

我将实体保存到SQL Server 2005数据库时遇到问题.我正在使用NHibernate 2.0.0.3002作为我的持久层.映射是典型的,具有整数ID,如下所示

<id name="Id" unsaved-value="0">
  <column name="Id"/>
  <generator class="identity" />
</id>
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我省略了其余部分.应用程序使用具有通用保存方法的存储库类,如下所示

public void Save(T toSave)
{
    Save(new T[] { toSave });
}

public void Save(IEnumerable<T> toSave)
{
    using (ISession session = SessionFactory.OpenSession())
    {
        foreach (T item in toSave)
        {
            session.SaveOrUpdate(item);
        }
        session.Flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

在会话上调用SaveOrUpdate时,会抛出一个带有"null identifier"消息的异常.当我检查数据库时,已插入所有正确值的行,所以我认为问题是当NHibernate尝试使用@@ IDENTITY返回的值设置实体的Id属性时.我可以通过SQL事件探查器看到正在调用@@ IDENTITY,所以我不明白为什么抛出异常.

有没有其他人有这个问题?

Ben*_*Ben 8

Save和Delete都必须在事务中发生,并且事务必须在最后提交.

像这样:

public void Save(IEnumerable<T> toSave)
{
    using (ISession session = SessionFactory.OpenSession())
    {
        ITransaction transaction = Session.BeginTransaction();

        foreach (T item in toSave)
        {
            session.SaveOrUpdate(item);
        }

        transaction.Commit();           
        session.Flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意:您需要将其包装在使用中并正确回滚...此外,根据您的方案,放置您打开和提交事务的位置也很重要.你完成后也应该关闭交易......

另外,您能详细说明异常发生的位置吗?听起来你正在保存一个父母,然后孩子正在抛出,因为父母的id是空的?或者,它实际上是在拯救父母吗?