我将实体保存到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,所以我不明白为什么抛出异常.
有没有其他人有这个问题?
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是空的?或者,它实际上是在拯救父母吗?
| 归档时间: |
|
| 查看次数: |
7091 次 |
| 最近记录: |