Linq to sql测试存储过程 - 在一个事务中调用过程,验证和回滚

时间:2014-03-31 12:34:32

标签: sql-server stored-procedures linq-to-sql transactionscope

我试图将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();
        }

1 个答案:

答案 0 :(得分:0)

我相信你来一个陈旧的datacontext问题。

您的更新是通过存储过程完成的,因此您的上下文不会"请参阅"更改并无法更新用户。

如果使用新的datacontext来执行断言,它通常可以正常工作。但是,由于您正在使用事务,因此可能必须将第二个datacontext添加到同一事务中。