实体框架单行 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);
这是个好主意吗?
首先问问自己,在实体框架之上的存储库和工作单元模式的附加值是什么?
实体框架的上下文已经是一个工作单元,并且已经是一个存储库,那么为什么要创建另一个存储库呢?
此外,您应该从需要的那一刻起就创建一个上下文,并尽快将其处置。您的服务操作可能如下所示:
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一样。