我正在编写一些集成测试,用于测试与MS SQL Server数据库通信的.NET网站的数据访问层。
我正在使用TransactionScope回滚测试期间所做的任何更改,如下所示:
public class DatabaseFixture
{
private TransactionScope _transactionScope;
[SetUp]
public void SetUp()
{
_transactionScope = new TransactionScope(TransactionScopeOption.Required);
}
[TearDown]
public void TearDown()
{
_transactionScope.Dispose();
}
}
我想知道我在INSERT语句中添加的行的ID,因此我的查询看起来像insert into Exercises (Name) Values (@Name); SELECT SCOPE_IDENTITY();
。
一旦我添加了TransactionScope,SCOPE_IDENTITY()就不再返回正确的值。它总是返回1,即使该行可能是id 3或4.我猜这与事务未提交的事实有关。
SCOPE_IDENTITY()不是正确的方法吗?
答案 0 :(得分:1)
这与交易无关,我只是错误地使用了Dapper ORM。
我只是使用Execute而不是ExecuteScalar来执行我的插入操作,因此它没有返回我的select值。
以下是有效的代码:
var exerciseQuery = "insert into Exercises (Name) Values (@Name);" +
"SELECT SCOPE_IDENTITY();";
exercise.Id = connection.ExecuteScalar<int>(exerciseQuery, new { Name = name});