Entity framework 如何让2个ADO访问方法使用同一事务?
我正在写一个测试,看看我的LINQ到实体语句是否有效。。如果我能让这个概念继续下去,我会把它用于其他人 我在这里的意图是用ADO插入一条记录,然后验证它是否可以用LINQ查询,最后回滚整个过程 我使用ADO来插入,因为我不想使用我正在测试的对象或实体模型。我认为一个普通的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
_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();
}