【发布时间】:2009-01-29 22:04:45
【问题描述】:
我有一个包含 10 个数据对象的列表,我想使用 NHibernate 将它们插入/更新到数据库中。如果一个抛出异常(比如主键违规),我仍然想插入/更新另一个 9. 我将每个对象操作滚动到它自己的原子事务中,如果有异常则回滚事务。问题是,如果事务确实导致异常并回滚,则在下一个事务中 Nhibernate 抱怨错误:Nexus.Data.PortfolioCorporateEntity 条目中的 null id (发生异常后不刷新会话)
我的主程序很简单。它从会话工厂创建会话,创建数据访问层,对数据对象进行一些处理,然后尝试将这些数据对象持久化到数据库中。
sessionsManager = new NHibernateSessionManager();
session = sessionsManager.GetSession();
DALC = new NHibernateDataProvider(session);
…
foreach (var pce in pces)
{
try
{
DALC.UpdateOrAddObject<PortfolioCorporateEntity>(pce);
}
catch (Exception ex)
{
Console.WriteLine("Could not add Corporate Entity ID " + pce.CorporateEntity.CorporateEntityID.ToString());
}
}
这是我的 Nhibernate 数据访问层中的 updateOrAdd 过程,为 10 个对象调用了 10 次。
public void UpdateOrAddObject<T>(T workObject)
{
using (ITransaction tx = mSession.BeginTransaction) {
try {
mSession.SaveOrUpdate(workObject);
mSession.Flush();
tx.Commit();
}
catch (Exception ex) {
tx.Rollback();
throw;
}
}
}
为了明确一点,会话由调用程序实例化并传递给数据访问层对象,其构造函数如下。
public NHibernateDataProvider(ISession session)
{
mSession = session;
}
这工作正常,除了在异常之后,它说不要在异常后刷新会话。我不知道为什么——事务很好地回滚了,数据库应该准备好接受另一个事务了,不是吗?我做错了什么?
【问题讨论】:
标签: nhibernate