从EntityFramework调用存储过程时出错

34

我正在尝试从EntityFramework访问存储过程,按照以下步骤进行操作:

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

然后,我更新了 .edmx 模型,只选取了我想要的存储过程。

完成后,在“函数导入”中可以看到添加了存储过程,但不在“存储过程”部分中。我该怎么做才能在此处显示?

在“函数导入”部分,所有参数均被设置为输入,而“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.

在这里输入图像描述

10个回答

35

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

我必须对存储过程进行更改,并且它从实体数据模型 XML 文件(*.edmx)中被删除了。

具体的解决步骤如下:

有一种简单的解决方法来修复这个错误。首先打开你的 edmx 文件,然后右键单击拥有存储过程的模型。选择“添加”,然后选择“添加函数导入”。

在函数导入名称处输入与上下文文件中使用的相同的函数导入名称(如果像我一样,该方法已经被创建但出现了问题,否则就是全新的,将被重新创建)。选择要修复的存储过程名称。选择实体并单击“确定”。可能会弹出一个新窗口:“验证函数导入名称是否唯一”。

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


我的问题是,在选择“添加函数导入”时,我在存储过程/函数名称上没有任何选项。 - Ingrid
@Ingrid - 我也遇到了同样的问题。尝试通过使用“从数据库更新模型”(在EDMX设计器中右键单击)来删除现有的SP和结果集,并重新添加它 - 然后在对话框中选择SP(添加)。 - Matt

28

这篇文章应该是一条评论,但是我没有足够的声望来进行评论。

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


2
这对我起作用了。我还不得不在模型浏览器中的复杂类型文件夹下删除 p_procname_Result 对象。 - Damian Green

2
当您打开edmx浏览器(图表模式)时,您会在图表旁边看到模型浏览器窗口。
在函数导入部分尝试找到您的存储函数。右键单击它,然后您可以修改它。
一个窗口将被打开,然后选择您的存储函数。之后将映射一个函数。
完成了,对我有效。

2

我遇到了这个错误:

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

当我查看时,我的存储过程被从数据库中删除了。我重新创建了它,并修复了错误。


1

以下步骤解决了我的问题: 在Visual Studio中打开.edmx文件设计器。 在设计器中右键单击并选择模型浏览器。 在模型浏览器中双击实体,编辑函数导入向导将会打开。 在这个向导中确保与存储过程对应的下拉菜单正确填充。 重新构建


1

在devArt,EF 5.0上使用oracle db时,我遇到了问题。解决方法是从模型中删除该存储过程,然后重新添加它。确保存储过程在数据库中正确编译,否则您将无法将其添加到模型中。


1

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


0
通常在这种情况下我会做以下操作: 1. 在Notepad++中打开.edmx文件。 2. 删除引起问题的存储过程/视图/表的任何引用。 3. 在Visual Studio(设计器)中打开edmx文件,并再次更新模型。 4. 对于存储过程,在Notepad中确保删除了任何引用,然后在Visual Studio的更新模型窗口中,该存储过程将显示在树形结构中,您可以选择它。通过这样做,代码将重新生成该存储过程的部分。

0

如果任何人仍然遇到相同的问题,请在模型浏览器中执行以下两个步骤:

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

然后再像最初一样添加它 enter image description here


-1

只需删除导致问题的存储过程,保存edmx并删除类似名称的存储过程,如_1作为后缀。删除所有这样的出现,然后导入您更新的存储过程。


"删除存储过程", "删除相似名称的存储过程", "删除所有这样的出现"。很不清楚所有这些删除操作应该在哪里进行。对我来说,这似乎是对此答案的重复。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接