我试图将linq用于sql以进行存储过程的集成测试。我试图调用更新存储过程,然后从db检索更新的行以验证更改。所有这些都应该在一个事务中发生,以便我可以在验证后回滚事务。
代码在assert中失败,因为我检索的行似乎没有更新。我知道我的SP在从普通代码调用时起作用。是否有可能在同一事务中看到更新的行?
我正在使用Sql Server 2008并使用sqlmetal.exe创建linq-to-sql映射。
我尝试了很多不同的事情,现在我的代码看起来如下:
DbTransaction transaction = null;
try
{
var context =
new DbConnection(
ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
context.Connection.Open();
transaction = context.Connection.BeginTransaction();
context.Transaction = transaction;
const string newUserName= "TestUserName";
context.SpUpdateUserName(136049 , newUserName);
context.SubmitChanges();
// select to verify
var user=
(from d in context.Users where d.NUserId == 136049 select d).First();
Assert.IsTrue(user.UserName == newUserName);
}
finally
{
if (transaction != null) transaction.Rollback();
}
答案 0 :(得分:0)
我相信你来一个陈旧的datacontext问题。
您的更新是通过存储过程完成的,因此您的上下文不会"请参阅"更改并无法更新用户。
如果使用新的datacontext来执行断言,它通常可以正常工作。但是,由于您正在使用事务,因此可能必须将第二个datacontext添加到同一事务中。