【问题标题】:Error calling Stored Procedures from EntityFramework从 EntityFramework 调用存储过程时出错
【发布时间】:2015-05-13 13:47:52
【问题描述】:

我正在尝试从 EntityFramework 访问存储过程。

我已按照以下步骤操作:

首先我在 Azure 数据库中创建了存储过程:

然后,我从数据库中更新了 .edmx 模型,只选择了我想要的 StoredProcedure。

完成后,在函数导入中,我看到添加了 StoredProcedure,但未在 StoredProcedures 部分中。 我该怎么做才能让它出现在这里?

在函数导入部分,所有参数都设置为输入,而“MaxReference”应标记为输出。 怎么改?

虽然这两个问题我已经执行了代码:

我得到了以下异常:

EntityCommandCompilationException
An error occurred while preparing command definition. See the inner exception for details.

和 InnerException:

The function import 'DataModelEntities.AssignMaxSalesRef' cannot be executed because it is not assigned to a storage function.

【问题讨论】:

    标签: c# entity-framework azure stored-procedures


    【解决方案1】:

    您可能想参考这篇博文:FunctionImport is not mapped to a store function Error,其中讨论了类似的问题。原因显然是:

    我必须对存储过程进行更改,它已从实体数据模型 Xml 文件 (*.edmx) 中删除

    使用以下分步解决方案:

    有一个简单的解决方案可以修复该错误。首先打开您的 edmx 文件并右键单击拥有存储过程的模型。点击添加,然后选择“添加函数导入”。

    添加与上下文文件中使用的相同的函数导入名称(如果像我一样,该方法已经创建但搞砸了,否则就是全新的,无论如何都会重新创建)。选择您要修复的存储过程名称。选择实体并单击确定。可能会弹出一个新窗口“验证 FunctionImport 名称是否唯一”。

    如果是这种情况,并且弹出“验证 FunctionImport 名称是否唯一”窗口,请执行以下操作:打开 *.edmx 文件并右键单击要更新的模型。选择“在模型浏览器中显示”。现在模型浏览器窗口打开。转到:{myProject}.DataModel > EntityContainer:{somethingEntities} > 函数导入。导致问题的函数导入应该在那里,只需将其删除并保存 *.edmx 文件即可。

    尝试再次添加函数导入。瞧!这次没有问题。保存 *.edmx 文件并重新创建上下文文件(通过进行简单的非侵入性更改,例如在 {myProject}.Context.tt 文件中添加空格)。确保新方法:

    public virtual ObjectResult<MyEntity> <MyEntity>_NameoftheSP(parametets) 存在于您的上下文文件中。

    另一个故障排除资源,其中包含有关更新 edmx 文件的类似分步说明(和图像!):The function import cannot be executed because it is not mapped to a store function

    【讨论】:

    • 我的问题是在选择“添加函数导入”时,我在存储过程/函数名称上没有选项。 span>
    • @Ingrid - 我有同样的问题。尝试删除现有的 SP 和结果集并使用“从数据库更新模型”重新添加它(在 EDMX 设计器中右键单击) - 然后在对话框中选择 SP(添加)。
    【解决方案2】:

    这篇文章应该是评论,但我没有足够的代表发表评论。

    我遇到了类似的问题。我的存储过程是可见的,但我仍然收到错误。 Alex 的这个问题和回答让我查看了模型浏览器中的函数导入下,我看到每个存储过程都有多个条目。它们有序列号以防止它们成为真正的重复项。我删除了 Function Imports 下的所有内容以及 Stored Procedures / Functions 下的所有内容,然后通过从数据库中更新模型来重新添加它们。我的问题现在已经解决了。

    【讨论】:

    • 这对我有用。我还必须删除模型浏览器中 Complex Types 文件夹下的 p_procname_Result 对象。
    【解决方案3】:

    我遇到了这个错误:

    The function import *XXX* cannot be executed because it is not mapped to a store function.
    

    当我检查时,我的存储过程已从数据库中删除。我再次创建它,它修复了错误。

    【讨论】:

      【解决方案4】:

      当您打开 edmx 资源管理器(图表模式)时,您会在图表的一侧看到模型资源管理器窗口。

      在函数导入部分尝试找到您存储的函数。右键单击它,然后你可以修改它。

      将打开一个窗口,然后选择您存储的功能。之后会映射一个函数

      瞧,它对我有用。

      【讨论】:

        【解决方案5】:

        在 devArt、EF 5.0 上使用 oracle db。为我解决的问题是从模型中删除所述存储过程,然后重新添加它。确保存储过程在 DB 中正确编译,否则您将无法选择将其添加到模型中。

        【讨论】:

          【解决方案6】:

          对于那些尝试过该解决方案但仍无法正常工作的人,请确保您的 proc 没有任何列名无效或任何其他相关问题。我收到了相同的错误消息,但在我的情况下,它是 proc 中的无效列名引用。

          【讨论】:

            【解决方案7】:

            如果还有人遇到同样的问题,请在模型浏览器中执行以下两个步骤

            1. 从“模型”选项卡中的“函数导入”中删除函数
            2. 从存储中删除过程

            然后像我们最初做的那样再次添加它

            【讨论】:

              【解决方案8】:

              以下步骤为我解决了它: 在 Visual Studio 中打开 .edmx 文件设计器。 在设计器中右键单击并选择模型浏览器。 在模型浏览器上双击实体,编辑函数导入向导打开。 在此向导中,确保与存储过程对应的下拉列表已正确填充。 重建

              【讨论】:

                【解决方案9】:

                在这种情况下我通常会做什么: 在记事本++中打开.edmx文件 删除对导致问题的存储过程/视图/表的任何引用。 在visual studio(设计师)中打开edmx,再次更新模型。 对于存储过程,请删除记事本中的任何引用,然后在 Visual Studio 中的更新模型窗口中,SP 将显示在该树中,您可以选择它。通过这样做,将为该 SP 重新生成代码。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-12-25
                  • 2014-08-16
                  相关资源
                  最近更新 更多