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
내 모든 저장소 작업을 간단하게 래핑해야합니까?
이 SO (61 표를 넣은 답변)를 살펴보십시오. http://stackoverflow.com/questions/815586/entity-framework-using-transactions-or-savechangesfalse-and-acceptallchanges – Klinger
EF 및 ExecuteSqlCommand 명령을 실행하기 전에 트랜잭션을 시작하는 한. 그리고 실수하지 않으면 EF에 변경 사항을 저장하라는 메시지가 표시되면 사용 가능한 경우 기존 트랜잭션을 사용합니다. – Klinger
게시물이 도움이되었습니다. 나는 UoW를 버리고 결국 트랜잭션 범위 만 차지했다. –