Entity Framework,TransactionScope 混合使用的问题讨论

时间:2021-04-07 02:30:46
using (var ts = new TransactionScope())
{
    string connStr = "Data Source=.;Initial Catalog=Test;Integrated Security=true;";
    using (SqlConnection connection = new SqlConnection(connStr))
    {
        // Create the command and set its properties.
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandText = "InsertMessage";
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@ID", 1));
        command.Parameters.Add(new SqlParameter("@Message", "dfd"));
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
        using (var context = new Entities())
        {
            context.Message.Add(new Message { ID = 222, Msg = "dfdfd" });
            context.SaveChanges();
        }
    }
    ts.Complete();
}

会报错,除非你打开MSDTS这个windows service
原因是:If you use a single connection within a TransactionScope, it will be done as a local transaction (handled within that connection). If multiple db connections are involved, it will be escalated to a distributed transaction which requires that MSDTC is running on both the machine where your code runs and on the DB server, and that MSDTC on the client has permissions to communicate with MSDTC on the server (http://www.datazx.cn/Forums/en-US/0a365486-c57a-4ee9-a59f-e90a4a4abfbf/action?forum=adodotnetentityframework)

EntityFramework5有一个办法可以解决这个问题

using (var context = new Entities())
{
    context.Database.Connection.ConnectionString = connStr;     context.Message.Add(new Message { ID = 222, Msg = "dfdfd" });
    context.SaveChanges();
}

以下版本暂时没找到好的办法,大家有什么方法吗?