【问题标题】:Disabling SQL Generation in Entity Framework?在实体框架中禁用 SQL 生成?
【发布时间】:2014-03-25 00:41:03
【问题描述】:

我想知道是否有人找到了完全禁止 EF 使用生成的 SQL 或完全禁止 EF 执行即席 SQL 语句的方法。换一种说法,我想强制实体框架使用在我的 .edmx 文件中定义为映射的存储过程与数据库交互。

我为什么要做这样的事情?

我在一个应用程序中使用 EF 作为我的 ORM,该应用程序使用存储过程(由于安全要求)与数据库交互。有时很容易忘记在我的 .edmx 文件中定义存储过程映射。发生这种情况时,EF 将尝试在运行时生成 ad-hoc SQL - 这会导致运行时安全错误,因为 EF 将尝试针对禁止 ad-hoc SQL 执行的数据库执行此生成的 SQL。

由于我的大部分开发工作和单元测试都是使用确实启用了临时 SQL 执行权限的用户帐户完成的,因此这些运行时安全错误经常被遗漏。

我在这里考虑过的一些选项:

  1. 切换到另一个 ORM - 也许还有另一个 ORM 可以更好地支持存储过程,但是到目前为止我还没有真正看到更好的选择。

  2. 在我用于开发的用户帐户的 SQL 中禁用临时 SQL 执行。这是有问题的,因为我的单元测试在某些情况下需要使用临时 SQL 将测试数据等注入数据库。这也是有问题的,因为当我编写代码时,能够对数据库执行 ad-hoc sql 语句(操作数据、注入测试数据等)非常方便,并且禁用 ad-hoc SQL 执行将意味着不断切换用户或失去这种能力。

  3. 以某种方式禁用 EF 中的临时 SQL 生成。这似乎是迄今为止最好的选择,因为我可以继续开发,并使用具有 SQL 执行权限的用户进行测试 - 如果我忘记了存储过程映射,我的测试将失败,或者我会收到运行时错误。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    我要做的是将单元测试本身作为与您的开发用户不同的用户运行,该用户没有特别权限,但作为您的开发用户运行单元测试的设置和拆卸步骤。

    它为您提供两全其美的优势,既可以在与部署相同的环境中进行单元测试,又可以设置所述测试的管理员权限。

    【讨论】:

    • 不幸的是,我不得不同意,目前,这可能是唯一的解决方案。不幸的是,它仍然不是一个很好的解决方案,因为它仍然依赖于内存/约定而不是技术 - 即我需要记住以这样一种方式编写我的单元测试,即我在测试中使用不同的用户/连接字符串与设置/拆卸方法。如果我忘记在我的测试中更改用户,我的测试很可能最终会通过,即使它不应该。我仍然认为能够在 EF 中禁用 SQL 生成会更好
    • 使用单独的连接字符串进行数据库单元测试是一种非常常见的做法。您将在测试的 app.config 文件中有两个命名的连接字符串,一个用于设置,一个用于测试运行。请参阅Database Unit Tests 上的第 9 频道教程,它不直接讨论 EF 单元测试,但您可以将“预测试”、“测试”和“后测试”阶段的概念应用于您自己的 EF 测试。
    • @actf 如果您使用的是 EF6,您可以使用新的 Interceptions feature,如果它尝试生成不调用存储过程的 SQL,则让它抛出某种“NotSupportedException”,但我有从来没有使用过它,所以我无法帮助你如何去做。如果你弄清楚了,把它作为你自己问题的答案发布,我会赞成。
    • 谢谢,那个演示文稿看起来很有趣,我想这可能是我最终要走的路。但在实践中,这可能需要大量额外的工作,因为我有数千个需要大量重构的现有测试——所以理想情况下,我仍在寻找满足 #3 的解决方案。你的第二个想法也很有趣,虽然我被困在 VS 2010 中,所以对我来说是 EF4 :-(
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多