Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何让2个ADO访问方法使用同一事务?_Entity Framework_Ado.net_Transactions - Fatal编程技术网

Entity framework 如何让2个ADO访问方法使用同一事务?

Entity framework 如何让2个ADO访问方法使用同一事务?,entity-framework,ado.net,transactions,Entity Framework,Ado.net,Transactions,我正在写一个测试,看看我的LINQ到实体语句是否有效。。如果我能让这个概念继续下去,我会把它用于其他人 我在这里的意图是用ADO插入一条记录,然后验证它是否可以用LINQ查询,最后回滚整个过程 我使用ADO来插入,因为我不想使用我正在测试的对象或实体模型。我认为一个普通的ADO插入就可以了 问题是。。它们都使用不同类型的连接 是否可以让这两种不同的数据访问方法使用相同的事务,以便我可以回滚它?? _conn = new SqlConnection(_connectionString); _con

我正在写一个测试,看看我的LINQ到实体语句是否有效。。如果我能让这个概念继续下去,我会把它用于其他人

我在这里的意图是用ADO插入一条记录,然后验证它是否可以用LINQ查询,最后回滚整个过程

我使用ADO来插入,因为我不想使用我正在测试的对象或实体模型。我认为一个普通的ADO插入就可以了

问题是。。它们都使用不同类型的连接

是否可以让这两种不同的数据访问方法使用相同的事务,以便我可以回滚它??

_conn = new SqlConnection(_connectionString);
_conn.Open();

_trans = _conn.BeginTransaction();

var x = new SqlCommand("INSERT INTO Table1(ID, LastName, FirstName, DateOfBirth) values('127', 'test2', 'user', '2-12-1939');", _conn);

x.ExecuteNonQuery();     //So far, so good.  Adding a record to the table.

//at this point, we need to do **_trans.Commit()** here because our Entity code can't use the same connection. Then I have to manually delete in the TestHarness.TearDown..  I'd like to eliminate this step


//(this code is in another object, I'll include it for brevity. Imagine that I passed the connection in)
//check to see if it is there
using (var ctx = new XEntities(_conn)) //can't do this.. _conn is not an EntityConnection! 
{
    var retVal = (from m in ctx.Table1
                  where m.first_name == "test2"
                  where m.last_name == "user"
                  where m.Date_of_Birth == "2-12-1939"
                  where m.ID == 127
                  select m).FirstOrDefault();

     return (retVal != null);
 }

//Do test.. Assert.BlahBlah();

_trans.Rollback();

当然,由于此时您有一个对象上下文,如果您更愿意新建数据实例、附加和保存更改,则不必使用ExecuteStorommand。

是的,只需使用:


不需要其他显式事务处理。请注意,如果使用两个不同的连接,则需要运行DTC。

这是我根据所选答案创建的最后一个测试。实际上,我正在测试一个对数据库进行LINQ到实体调用的服务。(您看到的LINQ基本上就是WCF服务功能中的LINQ)

这样,我就可以使用插入的相同连接调用该服务。。(我实际上可以将连接和事务内容移动到setup&teardown,但简而言之就是这样)


“DTC正在运行”是什么意思?这是服务吗?这也是一个非常好的回答,因为它触及了我问题的核心。由于DTC存在未知的安全问题,我最终没有拿起它。然而,我问的问题完全有道理。在我的例子中,我没有访问两个不同的数据库,但如果我访问了,这将是正确的答案。@KevinDeus-我提到DTC,因为有时即使你没有使用两个数据库(只是同一个数据库的两个连接),它仍然希望以任何方式使用DTC。至少这是我的经验。最好是重用ObjectContext使用的连接。应该尽可能长时间地避免分布式事务。这将涉及DTC和性能方面,最好避免,我认为在您的情况下,您可以这样做。它还取决于您使用的SQL server版本。您可以通过以下方式访问它((EntityConnection)objectContext.Connection);这可能是解决我问题的最好办法。我能够将INSERT语句插入到x.ExecuteStoreCommand()中,而不是使用SqlCommand()。幸运的是,我能够为这两个应用程序使用相同的连接字符串,因为它们位于同一个数据库中。谢谢你的回答!
_conn = new EntityConnection(_connectionString);
EntityTransaction myTrans = _conn.BeginTransaction();

using(MyObjectContext x = new MyObjectContext(_conn))
{
  x.ExecuteStoreCommand(insertString);
}

CallTest(_conn)

myTrans.Rollback();
using (TransactionScope ts = new TransactionScope()) {
    // Do something in ADO.NET with one connection.

    // Do something with Linq in another connection

    // Commit (or not if you want to roll back)
    //ts.Complete();
}
   [Test]
    public void Test_VerifyXXX()
    {
        var _conn = new EntityConnection(_connectionString2);

        _conn.Open();
        EntityTransaction myTrans = _conn.BeginTransaction();

        using (var x = new XEntities(_conn))
        {
            x.ExecuteStoreCommand("INSERT INTO Table1(ID, LastName, FirstName, DateOfBirth) values('127', 'test2', 'user', '2-12-1939');");
        }             

        XService test = new XService_Mock(_conn);
        bool results = test.CustomerVerified(127, "user", "test2", new DateTime(1939, 2, 12));

        Assert.IsInstanceOf(typeof(bool), results);
        Assert.AreEqual(true, results);

        myTrans.Rollback();
    }