刷新实体框架3.5中的存储过程

时间:2011-02-14 17:31:44

标签: visual-studio-2008 entity-framework stored-procedures

我正在使用.NET 3.5 SP1,VS 2008和实体框架。我最初在我的模型中添加了一个存储过程,它带有2个参数。后来,我改变了sproc只需要1个参数。我运行了Update Model From Database菜单选项并确认我的sproc已列在Refresh标签中。完成向导,清理并重建解决方案,模型从未改变过sproc的签名。

为什么不更新?数据库功能的更新模型是否已损坏?我错过了什么吗?感谢。

7 个答案:

答案 0 :(得分:134)

在将存储过程添加到实体框架后,我看到了更新存储过程的两个问题:

  • 为调用SPROC而创建的函数导入未更新(不正确,过时的参数)
  • 为SPROC的结果集创建的复杂类型未更新(错误的,过时的字段)

更新EDMX模型(功能导入)

  1. 打开.edmx文件(在GUI设计器中)。
  2. 在某个开放空间中单击鼠标右键,然后选择“从数据库更新模型”。
  3. 在弹出窗口中单击“完成(如果可以)”。您的SPROC签名应该更新(以及任何功能导入)。
  4. 更新存储过程复杂类型

    1. 打开.edmx时打开“模型浏览器”窗口。

    2. 展开 ContentModel EntityContainer:... ,然后功能导入节点。查找存储过程的函数导入,然后双击。您用于创建它的同一窗口将打开,但现在已填充其数据。

    3. 点击获取列信息按钮(查看按钮下方的网格以查看将要更改的内容)。

    4. 点击“复杂”单选按钮选项旁边的更新按钮。

    5. 点击确定,结果集的复杂类型应该更新。

答案 1 :(得分:6)

如果您需要更改结果集中列的数据类型 - >在stor proc开头添加 关闭fmtonly

然后使用 模型浏览器 - >功能导入 - >编辑你的过程 - >获取列信息按钮 - >更新按钮

尼尔是这样做的:)

答案 2 :(得分:1)

在XML上进行了大量的手动编辑,并重新启动了Visual Studio,但我终于能够让VS忘记之前的签名了。然后,我只是使用普通的EF向导将其重新添加,并且工作正常。

答案 3 :(得分:1)

如果更改存储过程的签名,则需要通过函数import更新模型中创建的任何复杂类型。

答案 4 :(得分:0)

您必须删除并添加存储过程,因为实体框架需要为您的过程生成新定义。我想你需要重做函数导入。

基本上,如果您更改了过程的逻辑而不是返回类型或签名,则无需再次添加它。它可以正常工作,但如果你改变了返回类型或签名,需要生成并将其映射到一个新的定义,就像它的工作方式一样。

答案 5 :(得分:0)

在EF4中存在类似的问题,其中没有刷新单个sps的选项,当你在更新向导中点击刷新但它无法可靠地工作时,它就是这样做的。我不得不在模型浏览器中删除返回值的复杂类型,以及函数import。然后使用XML编辑器进入edmx文件并删除对存储过程的引用(在模型浏览器中找不到这样做的方法)。然后重新添加sps。

答案 6 :(得分:0)

您还可以在以下位置删除SP的所有证据,当您打开.edmx文件时,可以在模型浏览器中找到这些文件:

  • YourModel>复杂类型;
  • YourModel>功能导入;
  • YourModel.Store>存储过程/功能。

删除后,您可以将其添加回来,没有任何问题。