实体框架单行CRUD

时间:2014-04-08 02:04:25

标签: c# entity-framework

寻求最佳实践建议

我经常在ASP.NET应用程序中为单个记录执行CRUD操作。

要删除,我就是这样做

var myRecord = context.myTable.Find(myID);
if (myRecord != null)
{
    context.myTable.Remove(myRecord);
    context.SaveChanges();
}

考虑做什么

new context().myTable.Find(myID).Remove();

在阅读了一些EF和存储库模式工作人员(特别是Here)之后,我理解了在通用存储库的帮助下,至少我能做到:

class UnitOfWork
{
    void RemoveRecord(myRecord)
    {
        var context = FindMyContext(myRecord); //[here](http://blogs.msdn.com/b/alexj/archive/2009/06/08/tip-24-how-to-get-the-objectcontext-from-an-entity.aspx)
        context.Entry(myRecord).State = EntityState.Deleted;
        context.SaveChanges();
    }
}

我可以像在我的代码中一样使用它:

new UnitOfWork.RemoveRecord(myRecord);

这是个好主意吗?

1 个答案:

答案 0 :(得分:2)

首先问问自己,在实体框架之上,存储库和工作单元模式的附加价值是什么?

实体框架的上下文已经 是一个工作单元,并且 是一个存储库,那么为什么要创建另一个呢?

此外,您应该从需要的那一刻起创建一个上下文并尽快处理它。您的服务操作可能如下所示:

 public void RemoveCustomer(int customerId)
 {
      using(var context = new MyDbContext())
      {
          var customer = context.Customers.SingleOrDefault(c => c.Id == customerId); 
          if (customer==null) throw new BusinessException("Customer does not exist");
          context.Customers.Remove(customer);    
          context.SaveChanges();
      }
 }

我个人用IoC框架注入这个上下文,比如使用StructureMap。