我正在尝试为我的ASP.NET MVC项目整合工作单元模式,它与使用Entity Framework的其他典型UoW设计略有不同。
我的数据库具有高度规范化和纯粹的关系结构,因为它并非真正 EF友好。因此我创建了映射到实体的视图,这样我在查询时仍然可以拥有所有EF和LINQ的优点,但我必须使用直接sql查询(例如Context.Database.ExecuteSqlCommand
)更新实体时。
这对我的UoW设计提出了挑战。据我所知,使用EF的UoW的一般方法是仅在调用Context.SaveChanges()
时才调用UoW.Commit()
。这样,所有跟踪的实体更改将立即作为单个事务提交到数据库。
然而,由于我使用Context.Database.ExecuteSqlCommand
,每当我更新实体时,交易将立即发生 ,因此失去了UoW的全部意义。我举一个例子:
EF的传统UoW:
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();
}
我的EF与你的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();
}
任何人都遇到过类似的问题?我应该放弃UoW,只需将我的所有存储库操作包装在一个TransactionScope
中吗?
答案 0 :(得分:1)
UoW不适用于直接SQL,因为ADO.net查询/命令不是懒惰的。您需要ADO.net事务来包装所有SQL查询。 UoW本质上是一种事务模式,它包装您的存储库以产生类似行为的事务。