如何在不使用TransactionScope的情况下使用EF4 Code First CTP 5分配事务?

时间:2011-01-26 02:21:47

标签: c# entity-framework transactions entity-framework-4 code-first

我正在尝试对实时数据库执行功能测试,以确保我的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!
        }
    }

2 个答案:

答案 0 :(得分:2)

也许MSDN上的这篇文章可能有用Managing Connections & Transactions,然后向下滚动到标题交易和实体框架。这就是我要开始的地方。

编辑:以下是更好的一个:How To: Manage Transactions in the Entity Framework

答案 1 :(得分:1)

这很俗气,但可能是你唯一的选择:

((EntityConnection)myObjectContext.Connection).StoreConnection.BeginTransaction(...