刷新entity framework3.5中的存储过程
我正在使用.NET 3.5 SP1,VS 2008与entity framework。 我最初添加一个存储过程到我的模型,其中2个参数。 后来,我改变了sproc只取1个参数。 我运行了Update Model From Database
菜单选项,并确认我的sproc列在“ Refresh
选项卡中。 完成向导,清理并重build解决scheme,模型永远不会改变存储的签名。
为什么不更新? 数据库function的更新模型是否被破坏? 我错过了什么吗? 谢谢。
在将它添加到entity framework之后,我看到了两个更新存储过程的问题:
- 创build调用SPROC的function导入没有更新(不正确,过时的参数)
- 为SPROC结果集创build的复杂types未更新(不正确,过期的字段)
更新EDMX模型(函数导入)
- 打开.edmx文件(在GUIdevise器中)。
- 在某个空白处右键单击并select“从数据库更新模型”。
- 在popup窗口上单击完成(如果可以)。 您的SPROC签名应该更新(以及任何function导入)。
更新存储过程复杂types
-
打开.edmx时打开“ 模型浏览器 ”窗口。
-
展开ContentModel , EntityContainer:… ,然后展开Function Imports节点。 查找存储过程的函数导入,然后双击它。 您用来创build它的同一个窗口将打开,但现在已经填充了它的数据。
-
单击“ 获取列信息”button(查看button下方的网格以查看将要更改的内容)。
-
单击“复杂”单选button选项旁边的更新button。
-
单击确定 ,结果集的复杂types应该更新。
您不必编辑edmx / xml。 做这个:
当你将一个存储过程带入EDMX(我正在讨论一个返回一个结果集的过程,但它将是一个类似的过程),3,而不是1,创build项目,这就是问题的根源。 (***问题的第二个来源是,在重新导入对象之前,必须在删除对象之后显式保存,否则重新导入的对象将与edmx中没有真正删除(通过保存)的内容冲突。
所以! 做这个:
在“模型浏览器”中,通常在左侧,将存储过程的名称粘贴到search框中,单击“input”(或search)。 它将首先着陆 – 可能是存储过程本身。 右键单击并删除。 现在,把光标放回search框 – >再次input或search。 现在你将着陆function导入。 右键单击并删除。 第三次做同样的事情 – 这将落在代表结果集的复杂types上。 删除它。 现在你完成不了!!!!! 你必须保存你刚刚做的事情,以便删除在edmx中写入(不写)。
现在,再次获取存储过程(更新模型/select存储过程)。 现在再次点击保存。
这将每次都有效。 关键是确保使用模型浏览器search出现在模型浏览器中的所有存储过程名称的实例,因此,最好不要使用默认的命名约定。 第二个关键是在完成任何步骤后保存。
如果需要更改结果集中的列的数据types – >在stor proc的开头添加set fmtonly off
然后使用Model Browser – > Function Import – > Edit Your Proc – > Get Column Informationbutton – > Updatebutton
这是尼尔如何:)
在XML上进行了大量的手动编辑,并重新启动了Visual Studio,但我终于能够让VS忘记以前的签名。 然后,我只是使用普通的EF向导添加它,它工作得很好。
如果更改存储过程的签名,则需要通过函数导入更新模型中创build的任何复杂types。
您必须删除并添加存储过程,因为entity framework需要为您的过程生成新的定义。 我想你需要重做function导入。
基本上,如果你已经改变了程序的逻辑,而不是返回types或签名,你不需要再次添加它。 它会正常工作,但如果你改变返回types或签名ef需要生成和映射到一个新的定义是它的工作方式。
在EF4中有一个类似的问题,那就是没有选项可以刷新单独的sps,而是在更新向导中单击刷新时执行此操作,但无法可靠地运行。 我不得不在模型浏览器中删除复杂types的返回值,还有导入函数。 然后用XML编辑器进入edmx文件,并删除对存储过程的引用(在模型浏览器中找不到这种方法)。 然后重新添加sps。
您也可以在以下位置删除SP的所有证据,当您打开.edmx文件时,可以在模型浏览器中find这些文件:
- YourModel>复杂types;
- YourModel>function导入;
- YourModel.Store>存储过程/函数。
删除后,您可以添加它没有问题。