实体框架单行 CRUD

本文关键字:CRUD 单行 框架 实体 | 更新日期: 2023-09-27 17:57:10

寻求最佳实践建议

很多时候,我必须对 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和存储库模式人员(尤其是这里)之后,我明白了在通用存储库的帮助下,至少我可以做到:

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);

这是个好主意吗?

实体框架单行 CRUD

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

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

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

 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一样。