我正在尝试对实时数据库执行功能测试,以确保我的linq查询正确地转换为SQL。我想通过使用事务来做到这一点,这样一个功能测试不会影响另一个。
问题是,我在API中找不到任何正确使用事务的方法。我可以通过DbTransaction
检索新的MyDbContext.Database.Connection.BeginTransaction()
,但是,无论如何我都找不到真正使用此交易。
我可以找到关于BeginTransaction()
调用的所有文档,您是通过SqlCommand
调用您正在执行操作的命令将事务对象分配给cmd.Transaction
。但是,使用EF4 CTP5时,无法访问用于查询的SqlCommand
。
因此,我无法弄清楚如何使用BeginTransaction()
开始的事务。
我不想使用TransactionScope
个对象,主要是因为Sql CE 4不支持它们,我更喜欢使用本地数据库而不是通过网络。 Sql CE 4支持通过BeginTransaction()
检索的事务,我只是不知道如何使用代码。
有没有人知道如何做到这一点?
<小时/> 编辑:在与Microsoft发送一些电子邮件之后,
TransactionScope()
调用似乎是与EF4进行交易的主要方式。要使TransactionScope
与Sql CE一起使用,您必须在开始事务之前明确地打开数据库连接,例如
[TestMethod]
public void My_SqlCeScenario ()
{
using (var context = new MySQLCeModelContext()) //ß derived from DbContext
{
ObjectContext objctx = ((IObjectContextAdapter)context).ObjectContext;
objctx.Connection.Open(); //ß Open your connection explicitly
using (TransactionScope tx = new TransactionScope())
{
var product = new Product() { Name = "Vegemite" };
context.Products.Add(product);
context.SaveChanges();
}
objctx.Connection.Close(); //ß close it when done!
}
}
答案 0 :(得分:2)
也许MSDN上的这篇文章可能有用Managing Connections & Transactions,然后向下滚动到标题交易和实体框架。这就是我要开始的地方。
编辑:以下是更好的一个:How To: Manage Transactions in the Entity Framework
答案 1 :(得分:1)
这很俗气,但可能是你唯一的选择:
((EntityConnection)myObjectContext.Connection).StoreConnection.BeginTransaction(...