实体框架的UnitOfWork模式,但具有直接SQL查询

时间:2016-12-26 00:56:49

标签: c# asp.net-mvc entity-framework design-patterns unit-of-work

我正在尝试为我的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中吗?

1 个答案:

答案 0 :(得分:1)

UoW不适用于直接SQL,因为ADO.net查询/命令不是懒惰的。您需要ADO.net事务来包装所有SQL查询。 UoW本质上是一种事务模式,它包装您的存储库以产生类似行为的事务。