3

我已经看到有关使用直接 SQL 进行 MVC 数据访问的其他问题,例如这里。大多数回答不回答问题,而是询问

“你为什么不想使用 ORM、EF、Linq 等?”

  1. 我的小组在数据仓库中进行自定义报告,该数据仓库需要大量复杂、高度调整的 Oracle 查询,这些查询是根据用户 GUI 参数选择进行操作的。

  2. 我最新的项目是为 SQL 报表开发人员开发一个 SQL 插件报表工具。他们将使用伪参数为报告创建一个预先调整好的 SQL,并通过 GUI 输入(和存储)。然后 GUI 会提示他们需要在运行时显示/请求的参数定义(名称和类型),以最终替换伪变量。

所以一条 SQL 语句可能如下所示:

SELECT * FROM orders WHERE order date BETWEEN '<Date1>' AND '<Date2>'

然后,报告开发人员将通过 GUI 添加两个名为Date1和的参数Date2,并将它们标记为日期字段。

然后,最终用户将选择报告,提示输入Date1Date2,GUI 将执行替换并运行 SQL。

如您所见,我别无选择,只能使用直接 SQL(尤其是在第二个示例中,并且理解我也必须放弃在第二个示例中的强类型)。

所以我的问题是:

  1. 什么时候需要绕过 EF/Linq(肯定有理由这样做),MVC 4 中的最佳实践是什么?
  2. 当我提前知道输出列时,如何最好地进行强输入?
  3. 和 CRUD 处理?
  4. 任何人都可以在这方面指出任何基于非 EF/Linq 的编码示例吗?
4

1 回答 1

2

我认为这是一个开放式问题,所以这是我的 2c。(如果 tl dr,请转到最后一部分)

  1. 对我来说,与其说是“通过 EF/Linq”,不如说是需要选择合适的数据持久化库。我在 MVC 中使用过 PetaPoco、Ado.Net、NHibernate/ActiveRecord、Linq2Sql、EF(我的主要选择)。

    最佳实践实际上来自于意识到控制器仍然是表示层的一部分,并且它不应该处理除了 HttpContext 相关操作 + 调用业务逻辑服务类之外的任何事情。

    我将我的类安排为:
    Presentation (MVC) -> Logic Services (Simple classes) -> Data Access (Context Wrapped in "repositories")。
    所以我无法想象是否使用 EF 会对 asp.net MVC 产生任何影响。

  2. 对我来说,数据访问在 DTO 中返回数据,例如

    公共列表 GetAllFoos()

    该方法字符串是从 xml 等连接还是执行简单的 Context.Foos.ToList() 与应用程序的其余部分无关。我只关心数据访问不会返回一个与列匹配的数据集。那些留在DAL。

  3. 请参阅第 1 点和第 2 点。我的存储库上有 CRUD 方法。它是如何完成的与应用程序的其余部分无关。采用我的存储库类的最基本接口之一:

    公共接口 IFooRepository { void Save(Foo foo) Foo Get(int id) void Create(Foo foo) void Delete(int id) }

    还没有提到的一点,DI也很关键。具体实现“FooRepository”可以选择请求依赖项,例如 Web 服务、上下文类等。然而,这些与依赖于接口的调用者完全无关。

  4. 如果您在上述 3 点之后仍然需要示例,请发表评论,我将使用 Ado.net 制作一些非常简单的东西。

==================================================== =========================
去EF还是不去EF。

对我来说,如果用新模式开始一个新项目,我会先使用 EF 代码。

将新代码安装到旧数据库 + 旧项目没有我可以重用的 ORM 映射 = PetaPoco。

==================================================== =========================
在您的项目中:

“SQL 报表开发人员的 SQL 插件报表工具”。“的”sql报告服务?我不确定你为什么需要做任何事情?SSRS 不是已经这样做了吗?(输入sql语句/数据源,生成参数表格等)。

如果不是,我会质疑设计决定。IMVHO,应用程序用户(我不在乎它是“报告开发人员”还是 w/e)输入 SQL 语句的需求通常源于“建筑宇航员”。当您通过 GUI 作为字符串输入时,如何调试 SQL 语句?你怎么知道表和关系?您要么深入研究 SSMS 并返回 gui,要么构建复杂的 UI(又名重建 SSMS)。

归根结底,如果你想为无数不同的用户提供无数的报告,你必须为此付费。我看到太多“架构宇航员”公开应用程序以接受 SQL 语句,只是为了让每个人都浪费时间猜测应该放入什么。根本没有节省成本。

好吧,如果你必须这样做,嗯……祝你好运。最好的办法是作为 DataTable 返回并将行/列/数据转储到视图中,其中嵌套的 foreach 循环遍历行然后列。

于 2013-04-21T13:05:15.690 回答