0

ASP.NET MVC 프로젝트에 작업 단위 패턴을 통합하려고하는데 Entity Framework의 다른 일반적인 UoW 디자인과 약간 다릅니다.Entity Framework에 대한 UnitOfWork 패턴 (직접 SQL 쿼리 포함)

내 데이터베이스는 실제로는 EF friendly이 아니라는 점에서 매우 정규화되고 순수한 관계형 구조를 가지고 있습니다. 이 때문에 쿼리 할 때 모든 EF 및 LINQ 장점을 여전히 가질 수 있도록 엔터티에 매핑 된 뷰를 만들었지 만 엔터티를 업데이트 할 때 (예 : Context.Database.ExecuteSqlCommand) 직접 SQL 쿼리를 사용해야합니다.

내 UoW 디자인에 대한 도전 과제입니다. 내가 아는 한 EF와 함께 UoW에 대한 일반적인 접근 방식은 이 호출 될 때만 Context.SaveChanges()을 호출하는 것입니다. 이렇게하면 모든 추적 된 엔티티 변경 사항이 데이터베이스에 대한 단일 트랜잭션으로 즉시 커밋됩니다.

그러나 Context.Database.ExecuteSqlCommand을 사용하고 있기 때문에 엔티티를 업데이트 할 때마다 트랜잭션이 즉각이되므로 UoW의 모든 부분이 손실됩니다. EF와

전통 UOW : EF와

public void CreateOrder() 
{ 
    var customer = new Customer(); 
    // this only adds the entity to the Context for tracking 
    // e.g. Context.Customers.Add(customer); 
    UoW.CustomerRepo.Add(customer); 

    // this too only adds the entity to the Context 
    var order = new Order(); 
    UoW.OrderRepo.Add(order); 

    // Commit. this internally calls Context.SaveChanges() 
    // sending all changes to the db in a single transaction 
    // Perhaps also with a TransactionScope. 
    UoW.Commit(); 
} 

내 UOW :

public void CreateOrder() 
{ 
    var customer = new Customer(); 
    // this inserts a customer to the db immediately 
    // e.g. Context.Database.ExecuteSqlCommand(insertSql); 
    UoW.CustomerRepo.Add(customer); 

    // This too inserts an order immediately 
    var order = new Order(); 
    UoW.OrderRepo.Add(order); 

    // There is no point calling Context.SaveChanges() 
    // here as all my changes are already executed with direct sql. 
    UoW.Commit(); 
} 

누구나 비슷한 문제를 가로 질러왔다 나는 예를 들어 줄거야? 난 그냥 여기에 포기하고 단일 TransactionScope 내 모든 저장소 작업을 간단하게 래핑해야합니까?

+0

이 SO (61 표를 넣은 답변)를 살펴보십시오. http://stackoverflow.com/questions/815586/entity-framework-using-transactions-or-savechangesfalse-and-acceptallchanges – Klinger

+0

EF 및 ExecuteSqlCommand 명령을 실행하기 전에 트랜잭션을 시작하는 한. 그리고 실수하지 않으면 EF에 변경 사항을 저장하라는 메시지가 표시되면 사용 가능한 경우 기존 트랜잭션을 사용합니다. – Klinger

+0

게시물이 도움이되었습니다. 나는 UoW를 버리고 결국 트랜잭션 범위 만 차지했다. –

답변

0

ADO.net 쿼리/명령이 게으르지 않으므로 바로 SQL에서는 작동하지 않습니다. 모든 SQL 쿼리를 래핑하려면 ADO.net 트랜잭션이 필요합니다. UoW는 기본적으로 리포지토리를 랩핑하여 동작과 같은 트랜잭션을 생성하는 트랜잭션 패턴입니다.

+0

솔직한 답변 주셔서 감사합니다. 나는 크리스마스 때조차도 여전히 도움을받을 수 있음을 알고있었습니다. :) –