using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
namespace SqlEFTester {
class Program {
static void Main(string[] args) {
ConnectionManager connectionManager = new ConnectionManager();
SqlConnection conn = connectionManager.Connection;
conn.Open();
//BEGIN TRAN
SqlTransaction tran = conn.BeginTransaction();
//Will do some legacy work using SqlTransaction, so can not use TransactionScope here.
MyContext context = new MyContext(conn);
List<Inventory> list = context.Inventories.Take(10).ToList();//Just get top 10 Inventories
//COMIT TRAN
tran.Commit();
Console.WriteLine("Done...");
Console.ReadLine();
}
}
class ConnectionManager {
public SqlConnection Connection {
get {
return new SqlConnection("Data Source=MYSERVER;Initial Catalog=MYDATABASE;Integrated Security=SSPI;");
}
}
}
[Table("Inventory")]
class Inventory {
[Key]
public int InventoryId { get; set; }
}
class MyContext : DbContext {
public EmutContext(SqlConnection conn)
: base(conn, false) {
//I have to close it, otherwise it will say "EntityConnection can only be constructed with a closed DbConnection."
base.Database.Connection.Close();
}
public DbSet<Inventory> Inventories { get; set; }
}
私がやっていることは、従来のADO.NET SqlTransaction
の内部でEFコードを実行することです。このSqlTransactionは完了しました。もはや使用できなくなります。エンティティフレームワークコード
私は接続を開いて、同じ接続をEFに渡して接続を再利用します。設計上、その不平から接続を閉じる必要があります
EntityConnectionは閉じたDbConnectionでのみ構築できます。
私は上記のコードを実行した場合、私は、トランザクションが完了した
を得ました。
私はコミットできません。注:私たちが使用するレガシーコードフレームワークのためにTransactionScope
を使用することはできません。
(これは、SqlConnectionオブジェクトを開きます)オープンEntityConnection、その後、私はコンテキストに閉じられたSqlConnectionオブジェクトを渡していますのでご注意ください!あなたのコードでは、接続を閉じて、これはあなたのトランザクションを終了します、このようにトランザクションはコミットする前に閉じられます。 – Artem
conn.Open()の直前でコンテキストを作成すると、「EntityConnectionは閉じたDbConnectionでのみ構築できます」コードラインをこのConnectionManagerのconnectionManager = new ConnectionManager()に移動します。 SqlConnection conn = connectionManager.Connection; MyContextコンテキスト=新しいMyContext(conn); conn.Open(); – sadhat75