寻求最佳实践建议
我经常在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);
这是个好主意吗?
答案 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。