扩展模型对象(例如Product)并添加插入数据库的Create()方法是否合适?(MVC 5实体框架6)
本文关键字:是否 MVC 框架 实体 方法 Product 例如 对象 模型 添加 扩展 | 更新日期: 2023-09-27 18:01:55
所以我目前正在扩展实体框架为我数据库中的每个表自动生成的类。我在这些进行扩展的部分类中放置了一些有用的方法来处理数据。
然而,我的问题是关于在数据库中插入行。在我的扩展类中包含一个方法来处理这个问题是好形式吗?例如,在Product控制器的Create方法中有如下内容:
[HttpPost]
public ActionResult Create(Product p)
{
p.InsertThisProductIntoTheDatabase(); //my custom method for inserting into db
return View();
}
我觉得这件事有点不对劲,但我说不清是怎么回事。感觉这个功能应该放在一个通用的MyHelpers.cs类中,或者别的什么,然后这样做:
var h = new MyHelpers();
h.InsertThisProductIntoTheDatabase(p);
你们觉得怎么样?我更愿意用"正确"的方式来做这件事。
MVC 5, EF 6
编辑:InsertThisProductIntoTheDatabase方法可能看起来像:
public partial class Product()
{
public void InsertThisProductIntoTheDatabase()
{
var context = MyEntities();
this.CreatedDate = DateTime.Now;
this.CreatedByID = SomeUserClass.ID;
//some additional transformation/preparation of the object's data would be done here too. My goal is to bring all of this out of the controller.
context.Products.Add(this);
}
}
我看到的一个问题是实体框架DBContext是一个工作单元。如果你在Application_BeginRequest上创建了一个工作单元,当你把它传递给控制器构造函数时,它就会作为整个请求的一个工作单元。也许在你的场景中它只更新了一个实体,但你可以向你的数据库中写入更多的信息。除非你在TransactionScope中包装所有内容,否则所有这些保存都将是独立的,这可能会使你的数据库处于不一致的状态。即使你用TransactionScope包装所有东西,我很确定事务将被提升到DTC,因为你在单个控制器中创建多个物理连接,而sql server并不是那么聪明。
走BeginRequest路线似乎比向所有实体添加方法来保存自己更少的工作。这里的另一个问题是,EF实体应该对它自己的持久性一无所知。这就是DbContext的作用。因此,将引用放回DbContext打破了这种隔离。
第二个原因,将审计信息添加到实体中,再次将其添加到每个实体中需要做很多工作。您可以覆盖上下文上的SaveChanges,并为每个实体做一次。请看下面的答案。
沿着这条路走下去,我认为你违反了SOLID设计原则,因为你的实体违反了SRP。引入一堆内聚,你最终会写出比你需要的更多的代码。所以我反对按你的方式去做。
你为什么不简单使用:
db.Products.Add(p);
db.SaveChanges();
你的代码会更干净,它肯定会更容易对你来说管理它并在将来获得帮助。internet上可用的大多数示例都使用这种模式。扩展方法和实体看起来不太好。
BTW: InsertThisProductIntoTheDatabase()
方法名是不是太长了?