Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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“;空标识符";插入实体后发生异常_Nhibernate - Fatal编程技术网

NHibernate“;空标识符";插入实体后发生异常

NHibernate“;空标识符";插入实体后发生异常,nhibernate,Nhibernate,将实体保存到SQL Server 2005数据库时遇到问题。我正在使用NHibernate2.0.0.3002作为我的持久层。映射是典型的,具有整数ID,如下所示 <id name="Id" unsaved-value="0"> <column name="Id"/> <generator class="identity" /> </id> public void Save(T toSave) { Save(new T[] { t

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

<id name="Id" unsaved-value="0">
  <column name="Id"/>
  <generator class="identity" />
</id>
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();
    }
}

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

<id name="Id" unsaved-value="0">
  <column name="Id"/>
  <generator class="identity" />
</id>
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();
    }
}
公共作废保存(T保存)
{
保存(新的T[]{toSave});
}
公共作废保存(IEnumerable to Save)
{
使用(ISession session=SessionFactory.OpenSession())
{
foreach(toSave中的T项)
{
会话.保存或更新(项目);
}
session.Flush();
}
}
在会话上调用SaveOrUpdate时,将引发一个异常,并显示一条消息“null identifier”。当我检查数据库时,该行已插入所有正确的值,因此我认为问题在于NHibernate试图用@@IDENTITY返回的值设置实体的Id属性。我可以通过SQL探查器看到正在调用@@IDENTITY,所以我不明白为什么会引发异常


还有其他人有这个问题吗?

我想不是generator class=“Identity”/>


请尝试generator class=“guid.comp”

NHibernate开发人员非常不鼓励标识。。我们遇到的主要问题是,在刷新之前,您无法获得Id。在Int情况下,HiLo将是一个很好的替代品

话虽如此,我想你真的想这么做

<id name="Id" column="Id" unsaved-value="0">
   <generator class="identity"/>  
</id>

保存和删除必须在事务中发生,并且必须在事务结束时提交事务

像这样:

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();
    }
}
public void Save(IEnumerable to Save)
{
使用(ISession session=SessionFactory.OpenSession())
{
ITransaction事务=Session.BeginTransaction();
foreach(toSave中的T项)
{
会话.保存或更新(项目);
}
Commit();
session.Flush();
}
}
请注意:您需要将其包装在一个使用并正确回滚。。。此外,打开和提交事务的位置取决于您的场景。您还应在完成后关闭交易


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

配置log4net以便您可以记录和查看NHibernate正在执行的操作可能是有帮助的

我曾经在使用Access时遇到过NHibernate的问题,通过设置日志记录,我可以准确地找出问题的原因,从而解决了这个问题


我收到的错误消息与您的不同,但这是我描述如何解决问题的文章。也许这对你有帮助。:)

我也有这个错误,解决方法是像Ben提到的那样将其包装到事务中。然而,我没能让Ben或gilles27代码正常工作——可能是因为我不熟悉泛型和NHibernate。我创建了一个稍微不同的实现(使用Fluent NHibernate v1.3):

publicstaticisessionlocaldbsession=null;
公共静态无效保存(T保存)
{
使用(var transaction=LocalDbSession.BeginTransaction())
{
LocalDbSession.Save(toSave);
Commit();
LocalDbSession.Flush();
}
}
公共静态无效保存(IEnumerable to Save)
{
使用(var transaction=LocalDbSession.BeginTransaction())
{
foreach(toSave中的T项)
{
LocalDbSession.Save(项);
}
Commit();
LocalDbSession.Flush();
}
}

我想你指的是guid.comb,不是guid.comp。在任何情况下,这都不起作用,因为我使用的是整数键,而不是GUID键。虽然这在这种特殊情况下不起作用,但它确实对我起作用。回答得不错。你能显示执行实际保存/更新的代码吗?当你尝试使用该ID时?我已按要求添加了代码。顺便说一句,你正在运行哪个版本的NHibernate?我已尝试使用此处显示的XML,但问题仍然存在。我认为XML和我上面的一样,只是更简洁一点。我用探查器检查了NHibernate正在执行的SQL,所有这些看起来都是正确的。它甚至调用@IDENTITY来检索记录的新ID,但在这之后会引发异常。我只是想说清楚,我使用的是SQL Server,而不是Access。我以为您在TS中说过您使用的是Access?不管怎么说,很好的家伙,我把所有试图帮助你但没有提供正确解决方案的人都降级了……如果我贬低了你的答案,冒犯了你,我向你道歉。然而,我相信在这个网站的精神,不正确或误导性的答案应该被否决,以便最好的内容是在顶部。投票否决你的答案对你或你链接到的博客文章没有任何批评。感谢您的帮助。+1此答案解决了我从SQLServer2005测试迁移到SQLSCompactEdition时遇到的问题。花了一个小时疯了,因为它在其中一个上工作,而在另一个上却没有。阅读您的帖子,更新我的配置,使用CE版本保存时没有错误!我已经按照建议将其包装在一个事务中,如果抛出异常,将调用rollback。这解决了我的问题,谢谢。该记录确实与其他两个记录有关系,但它们在创建该记录之前很久就存在(因此具有ID),因此我认为这与问题无关。我感到惊讶的是,将其全部封装在事务中已经修复了它,但也许我需要研究一下使用NHibernate会话和事务的最佳方式。任何指点都欢迎。真的没有最好的方法,伊姆霍。这完全取决于