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
을 사용할 수 없습니다.
당신이 conn.Open라고하기 전에 EmutContext을 만들려고 마십시오 (이도록 SqlConnection을 열 것이다) 나는 상황에 폐쇄도록 SqlConnection을 전달하고 있습니다? 코드에서 연결을 닫으면 트랜잭션이 완료되고 커밋 전에 트랜잭션이 닫힙니다. – Artem
conn.Open() 바로 전에 컨텍스트 생성을 이동하면 "EntityConnection은 닫힌 DbConnection으로 만 생성 할 수 있습니다."라는 메시지가 나타납니다. 코드 줄을이 ConnectionManager connectionManager = new ConnectionManager(); SqlConnection conn = connectionManager.Connection; MyContext context = 새로운 MyContext (conn); conn.Open(); – sadhat75