不使用实体框架的 MVC 架构

Posted

技术标签:

【中文标题】不使用实体框架的 MVC 架构【英文标题】:MVC architecture without using Entity Framework 【发布时间】:2013-09-26 19:12:49 【问题描述】:

我对 MVC 架构完全陌生,对架构有一些疑问,主要是由于没有使用实体框架,而是我一直在使用带有数据表和数据集的数据访问来将数据获取到应用程序。我想知道有关 MVC 模式的最佳实践,以防有人可以帮助提供某些链接或 pdf(没有实体框架)。我还想知道一件事,那就是,我们从哪里调用从数据库中获取数据的 DAL 方法?来自模型类还是来自控制器动作?

【问题讨论】:

MVC和Entity Framework是完全不相关的,不想用EF就不用了。对于数据访问,您可能对存储库模式感兴趣,它提供了对您通常从 MVC 操作中调用的数据访问对象的抽象。 数据源访问是从模型完成的,而不是控制器(通常通过存储库模式)。 @ChrisHardie 我没有使用任何存储库模式。我得到的是一个具有某些方法的类,它可以访问数据源并返回数据集等。我相信我需要在相关行动。我对我认为需要探索的存储库模式一无所知。谢谢! @JeroenVannevel 谢谢你的回复! 【参考方案1】:

这是一个如何使用 MVC 实现数据访问代码的简短演示。请注意,数据访问通常发生在控制器操作中,而不是上面提到的模型:

[HttpPost]
public ActionResult Update(MyModel model)
    //You call your data access code here and retrieve your entity
    DataAccessObject dao = new DataAcessObject();
    var entity = dao.Get(model.Id);
    //Now that you have your entity, update its properties from the model that
    //has been posted to this action
    entity.Name = model.Name;
    entity.Phone = model.Phone;
    //Once your entity has been updated, pass it to the Update method of the DAO
    dao.Update(entity);

有很多方法可以给这只猫剥皮,但上面的方法应该会给你一些想法。除非您的应用程序非常小,否则您应该考虑实现存储库模式以解耦您的 UI 和数据层。

【讨论】:

其实数据访问应该发生在Model而不是Controller中,这就是Model的重点 模型的目的是代表您的业务领域中的某些东西(汽车、人、订单)。持久性超出了模型的单一职责。如果您让 Visual Studio 使用 Entity Framework 实体作为其模型生成控制器,您将看到数据访问函数驻留在 DbContext 中,而不是模型中。 或者使用 Dapper,这是一个非常轻量级的准系统 ORM。【参考方案2】:

MVC 模式的良好实践: 视图:应该是纯 html,没有逻辑 控制器:这是 HTTP 处理程序,不应包含业务逻辑,而应仅包含表示逻辑(用于显示的 IF 条件等)。它不知道数据来自何处或如何获取数据。它只知道模型对象 模型:表示数据及其访问。模型应该访问数据库并获取数据并填充对象,然后控制器可以使用该对象传递给 View。

EntityFramework:与 MVC 无关,因此当您在 MVC 项目中使用 EntityFramework 时,您可能看不到后面提到的良好实践。

【讨论】:

以上是关于不使用实体框架的 MVC 架构的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC3 和实体框架代码优先架构

实体框架不允许在 localdb (Mvc 4- C#) 中插入列

VS 2017 中的 MySQL 和 MVC 实体框架不工作

ASP.NET C# MVC 实体框架

ASP MVC 数据库优先 - 刷新 EF 实体框架时丢失所有验证

我们如何使用 EF 在 ASP.Net MVC 应用程序中创建 3 层架构?