.net 如何使用TransactionScope处理MySql和实体框架?(获取多个同时连接…当前不受支持错误)

.net 如何使用TransactionScope处理MySql和实体框架?(获取多个同时连接…当前不受支持错误),.net,mysql,entity-framework-4,transactions,.net,Mysql,Entity Framework 4,Transactions,我有一个新的.NET 4.0控制台应用程序,它使用: MySql 6.4.4.0 实体框架4.2(代码优先) VisualStudio2010 到目前为止,这是可行的。我可以很好地添加和读取数据库 现在,当我添加TransactionScope时,如以下示例所示: public static void TestInsert() { using (TransactionScope scope = new TransactionScope()) { using (

我有一个新的.NET 4.0控制台应用程序,它使用:

  • MySql 6.4.4.0
  • 实体框架4.2(代码优先)
  • VisualStudio2010
到目前为止,这是可行的。我可以很好地添加和读取数据库

现在,当我添加TransactionScope时,如以下示例所示:

public static void TestInsert()
{
    using (TransactionScope scope = new TransactionScope())
    {
        using (var context = new MyDbContext())
        {
            // Create a test user
            DateTime dt = DateTime.Now;
            var user1 = new User { UserID = 1, UserName = "test" };
            context.Users.Add(user1);  <-- exception occurs here

            context.SaveChanges();
        }
    }
}
publicstaticvoidtestinsert()
{
使用(TransactionScope范围=新TransactionScope())
{
使用(var context=new MyDbContext())
{
//创建一个测试用户
DateTime dt=DateTime.Now;
var user1=新用户{UserID=1,UserName=“test”};

context.Users.Add(user1);请完成范围

Complete方法提交事务。如果引发异常

未调用Complete,事务将回滚


请参阅。

尝试此操作,在创建上下文后创建事务

public static void TestInsert()
{
    using (var context = new MyDbContext())
    {
        using (TransactionScope scope = new TransactionScope())
        {
            // Create a test user
            DateTime dt = DateTime.Now;
            var user1 = new User { UserID = 1, UserName = "test" };
            context.Users.Add(user1); 

            context.SaveChanges();

            scope.Complete();
        }
    }
}

您是否有令人信服的理由使用TransactionScope
?因为EF
Context
在单个事务中更新数据库。我想使用TransactionScope有两个原因:1)在每个单元测试中,我想在测试完成后恢复数据库(Roy Osherove的“单元测试艺术”推广的方法)。我愿意接受更好的建议。2)我发现我必须保存更改,以便后续查询获取这些更改,并且我调用数据访问层中的多个自包含操作。我需要业务层将多个独立操作放在一个事务下。同样,我也愿意接受这里的建议。@DanC你有没有找到解决问题的方法了吗?不幸的是,我找不到可靠的答案,所以我放弃了使用TransactionScope。相反,从长远来看,也许更好的是,我最终创建了一个到DbContext的接口,这样我就可以在单元测试中使用一个模拟,而根本不写入数据库。对于真正写入数据库,DbContext保存了c挂起应该作为一个事务。
[Table("User")]
public class User
{
    public User()
    {
    }

    // Primary key
    [Key]
    public int UserID { get; set; }
    public string UserName { get; set; }
}


public class MyDbContext : DbContext
{
    public MyDbContext() : base("DbContext")
    {
    }

    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Tell Code First to ignore PluralizingTableName convention
        // If you keep this convention then the generated tables will have pluralized names.
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}
<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <clear/>
    <add name="DbContext" connectionString="Server=localhost; Database=****; Uid=****; Pwd=****;" providerName="MySql.Data.MySqlClient"/>
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient"/>
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data"/>
    </DbProviderFactories>
  </system.data>
</configuration>
 scope.Complete();
public static void TestInsert()
{
    using (var context = new MyDbContext())
    {
        using (TransactionScope scope = new TransactionScope())
        {
            // Create a test user
            DateTime dt = DateTime.Now;
            var user1 = new User { UserID = 1, UserName = "test" };
            context.Users.Add(user1); 

            context.SaveChanges();

            scope.Complete();
        }
    }
}