我有一个集成测试,它试图插入一行,其中的一列是另一行所具有的唯一列的副本。为了插入行,我调用了在我的实体存储库中找到的代码:
using (var transaction = rb.unitOfWork.Session.BeginTransaction())
{
try
{
ret = (Key)rb.unitOfWork.Session.Save(entity);
transaction.Commit();
rb.unitOfWork.Session.Clear();
}
catch
{
transaction.Rollback();
rb.unitOfWork.Session.Clear();
throw;
}
}
当这段代码与重复的实体一起运行时,我可以看到插入来自 NHibernate Profiler。在该声明之后,我看到了以下警告和错误:
-- 语句#1 WARN: System.Data.SqlClient.SqlException (0x80131904): Violation of UNIQUE KEY constraint 'UQ_ Contract_C51D43DA5070F446'。无法在对象“dbo.Contracts”中插入重复键。重复键值为 (1005171)。该语句已终止。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data.SqlClient.SqlCommand.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlCommand .RunExecuteReaderTds(CommandBehavior cmdBehavior,
-- 语句 #2 错误:违反 UNIQUE KEY 约束“UQ_ Contract _C51D43DA5070F446”。无法在对象“dbo.Contracts”中插入重复键。重复键值为 (1005171)。该语句已终止。
-- statement #3 ERROR: could not execute batch command.[SQL: SQL not available]Could not synchronize database state with session
-- 语句#4 回滚事务
在这个测试之后,我做了很多查询测试,一切似乎都运行良好,直到我为同一个存储库点击更新语句。这是被调用的代码:
using (var transaction = rb.unitOfWork.Session.BeginTransaction())
{
rb.unitOfWork.Session.SaveOrUpdate(entity);
transaction.Commit();
rb.unitOfWork.Session.Clear();
}
rb.unitOfWork.Session.Evict(entity);
检查分析器显示更新被调用,紧接着,我得到这些语句:
-- 语句#1 WARN: System.Data.SqlClient.SqlException (0x80131904): Violation of UNIQUE KEY constraint 'UQ_ Contract_C51D43DA5070F446'。无法在对象“dbo.Contracts”中插入重复键。重复键值为 (1005171)。该语句已终止。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data.SqlClient.SqlCommand.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlCommand .RunExecuteReaderTds(CommandBehavior cmdBehavior,
-- 语句 #2 错误:违反 UNIQUE KEY 约束“UQ_ Contract _C51D43DA5070F446”。无法在对象“dbo.Contracts”中插入重复键。重复键值为 (1005171)。该语句已终止。
-- statement #3 ERROR: could not execute batch command.[SQL: SQL not available]Could not synchronize database state with session
据我所见,插入语句似乎将 NHibernate 置于失败状态。上面的更新代码会引发一个 GenericADOException,它显示 SQL Not Available。我一定在这里做错了什么。我应该以不同的方式处理异常吗?