从EntityFramework

时间:2015-05-13 13:47:53

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

我正在尝试从EntityFramework访问商店过程。

我已按照以下步骤操作:

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

enter image description here

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

enter image description here

完成后,在功能导入中,我看到添加了StoredProcedure,但未在StoredProcedures部分中添加。 我能做什么才能出现在这里?

enter image description here

在“函数导入”部分中,所有参数都设置为“输入”,而“MaxReference”应标记为“输出”。 我怎样才能改变它?

enter image description here

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

enter image description here

我得到以下例外:

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.

enter image description here

9 个答案:

答案 0 :(得分:28)

您可能需要参考此博客文章:FunctionImport is not mapped to a store function Error,它讨论了类似的问题。原因显然是:

  

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

使用以下逐步解决方案:

  

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

     

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

答案 1 :(得分:25)

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

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

答案 2 :(得分:2)

我遇到了这个错误:

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

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

答案 3 :(得分:2)

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

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

将打开一个窗口,然后选择您存储的功能。一个函数将在那之后加载

瞧,它适合我。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

对于那些尝试了该解决方案但仍然无法解决的问题,请确保您的proc不会出现无效的列名问题或任何其他相关问题。我收到了相同的错误消息,但就我而言,它是proc中无效的列名引用。

答案 6 :(得分:0)

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

  1. 从“模型”选项卡中的“函数导入”中删除函数
  2. 从商店删除程序

然后像我们最初enter image description here

一样再次添加它

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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