엔티티 프레임 워크 4는 응용 프로그램이 이미 구축되었으므로이 엔티티 프레임 워크 4를 다루고 있습니다.엔티티 프레임 워크 : 원자 트랜잭션 (데이터베이스 컨텍스트)
시나리오 : 동일한 트랜잭션이 여전히 올바른/검증 데이터 트랜잭션과 실행 때 DBTransaction 내 코드와 트랜잭션이 중반 방법으로 중단되고 롤백 번 (데이터베이스에 데이터를 삽입이) 다음에 다음 실행 구현 이전 예외를 제공하여 중단합니다. 롤백이 데이터베이스 컨텍스트에서 유효성 검사 메시지와 데이터를 SQL처럼 제거해야한다고 생각하기 때문에 이해하기가 어렵습니다. 참고 : 정적 DatabaseContext를 모두 사용하고 있습니다. (내가 시도)
public class TestClass
{
static SampleDataBaseEntities ctx = new SampleDataBaseEntities();
public void SqlTransaction()
{
ctx.Connection.Open();
using (DbTransaction transaction = ctx.Connection.BeginTransaction())
{
try
{
Student std = new Student();
std.first_name = "first";
//std.last_name = "last"; (This is responsible for generating the exception)
AddTeacher();
ctx.AcceptAllChanges();
transaction.Commit();
}
catch (Exception e)
{
transaction.Rollback();
}
finally
{
ctx.Connection.Close();
}
}
}
public void SqlTransaction2()
{
ctx.Connection.Open();
using (DbTransaction transaction = ctx.Connection.BeginTransaction())
{
try
{
Student std = new Student();
std.first_name = "first";
std.last_name = "last";
AddTeacher();
ctx.Students.AddObject(std);
ctx.SaveChanges(false);
transaction.Commit();
ctx.AcceptAllChanges();
}
catch (Exception e)
{
transaction.Rollback();
transaction.Dispose();
ctx.Connection.Close();
}
}
}
public void AddTeacher()
{
Teacher t = new Teacher();
t.first_name = "teacher_first";
t.last_name = "teacher_last";
t.school_name = "PUCIT";
ctx.Teachers.AddObject(t);
ctx.SaveChanges(false);
}
}
class Program
{
static void Main(string[] args)
{
TestClass test = new TestClass();
test.SqlTransaction();
test.SqlTransaction2();
}
}
솔루션 : SaveChanges를 사용 (거짓). SaveChanges (false) 및 ctx.AcceptAllChanges() 사용.
해결 방법 : 해결 방법은 DatabaseContext 개체를 인스턴스화하는 것입니다.
더 적절한 솔루션을 찾는 이유 인 컨텍스트를 인스턴스화하는 동안 복잡성 문제가 있습니다. 미리 감사드립니다.
정적 DatabaseContext를 사용하지 마십시오. 필요에 따라 하나를 만듭니다. 또한 SQL 트랜잭션을 수동으로 처리 할 필요가 없습니다. – Maarten
'컨텍스트를 다시 인스턴스화하는 복잡성 문제'는 무엇입니까? – Maarten
정적 DbContext는 스레드로부터 안전하지 않으므로 사용하지 마십시오. 또한 항상'using' 문을 사용하면 어떤 일이 잘못되면 컨텍스트가 변경 내용을 롤백합니다. –