gpt4 book ai didi

sql-server - 为什么使用Entity Framework时必须在存储过程中写SET FMTONLY OFF

转载 作者:行者123 更新时间:2023-12-03 07:04:18 27 4
gpt4 key购买 nike

我最近加入了我团队的一个项目。他们使用 ASP.NET MVC 和 MS SQL 以及 Entity Framework 作为 ORM。

我注意到 EF 中使用的每个存储过程在存储过程定义的开头都有这个公共(public)行

IF(0=1) SET FMTONLY OFF

我认为这是一个非常奇怪的情况,所以我在谷歌上搜索了一些相关信息,并向我的同事询问了此事。他们说,当 EF 映射存储过程时,它会将所有参数发送为 null 并跳过所有 if 循环。因此,它也会跳过 IF(0=1) 条件,然后SET FMTONLY OFF

在搜索SET FMTONLY OFF MSDN时,说

Returns only metadata to the client. Can be used to test the format of the response without actually running the query.

当您无法控制数据库时,这就会成为一个问题,您必须不断告诉 DBA 添加它,并一遍又一遍地向他们解释为什么需要它。

我仍然不清楚为什么需要这样做。如果有人可以详细解释一下这一点,或者引导我访问某个涵盖该主题的链接,那么对我来说意义重大。

最佳答案

IF(0=1) 设置为 FMTONLY 关闭在 Entity Framework 读取的存储过程中随意似乎是一件有风险的事情。

据我所知, Entity Framework 是将此标志设置为标准实践的唯一来源(大概其他 ORM 可能会使用它)。

目的(据我所知)是提供一种获取过程返回模式而不实际接触任何数据的方法。 (您不想仅仅为了更新 orm 的对象模型而执行一些存储过程。

所以除非你有一个表来计算 EF 模型更新的次数(这在学术上可能很有趣)

有关更多信息,请参阅 Stored procedure returns int instead of result set

将 ftmonly 与 Entity Framework 一起使用的最安全的方法(在我看来)是..在以下情况下

  1. 如果相关过程很复杂并且使 EF 感到困惑(EF 读取第一个返回的架构,忽略流程逻辑)
  2. 让 EF 为您立旗。 (我在下面清除它以提前退出)
  3. 始终使用错误逻辑(当 FTMONLY 打开时,该逻辑将被忽略 - 将其解释为 EF 正在尝试读取架构)
  4. 在复杂过程开始时执行以下操作

    if(0=1)  -- if FMTONLY is on this if condition is ignored
    begin
    -- this loop will only be entered if fmtonly is on (ie EF schema read)
    select
    column1
    ,column2
    ...
    ,columnX
    from whateverA
    cross join whateverB
    ...
    cross join whateverQ
    -- joins don't matter but they might make it easier to get the column definitions
    -- and names you desire. the important thing here is generating the proper
    -- return schema... which is as complex as whatever you are trying to return
    where 1=0

    set FMTONLY off -- do this so that you can now force an early return since EF
    -- usually only wants the first data set schema... other orms might
    -- do something different
    return -- this will be ignored if FMTONLY is still on

    end

关于sql-server - 为什么使用Entity Framework时必须在存储过程中写SET FMTONLY OFF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24794671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com