从EntityFramework调用存储过程时出错

我试图从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. 

在此处输入图像描述

您可能想参考这篇博文: FunctionImport未映射到商店函数Error ,它讨论了类似的问题。 原因显然是:

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

通过以下逐步解决方案:

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

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

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

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

public virtual ObjectResult _NameoftheSP(parametets)出现在Context文件中。

另一个故障排除资源,在更新edmx文件时有类似的逐步说明(和图像!): 无法执行函数导入,因为它未映射到存储函数 。

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

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

我有这个错误:

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

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

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

在函数导入部分尝试查找游览存储function,右键单击它,然后你可以修改它。

将打开一个窗口,然后选择您存储的function。 一个函数将在那之后加入maped

瞧,它适合我。

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