【问题标题】:Refreshing a stored procedure in entity framework 3.5在实体框架 3.5 中刷新存储过程
【发布时间】:2011-02-14 17:31:44
【问题描述】:

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

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

【问题讨论】:

  • 我认为这是 EF1.0 的问题 :(
  • 我如何知道我正在运行哪个版本的 EF?是否有适用于 3.5 的 EF 更新版本?
  • 这是一篇关于如何将 EF 与 .net 3.5 与 sproc 一起使用的文章。 mywpf-visu.blogspot.in/2012/04/…

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


【解决方案1】:

我发现在将存储过程添加到实体框架后更新存储过程有两个问题:

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

更新 EDMX 模型(函数导入)

  1. 打开 .edmx 文件(在 GUI 设计器中)。
  2. 在某个空白处右键单击并选择“从数据库更新模型”。
  3. 在弹出窗口中单击完成(如果可以)。应更新 SPROC 的签名(连同任何函数导入)。

更新存储过程复杂类型

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

  2. 展开 ContentModelEntityContainer: ...,然后展开 Function Imports 节点。查找存储过程的函数导入并双击它。您用来创建它的同一窗口将打开,但现在填充了它的数据。

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

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

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

【讨论】:

  • 是我还是这似乎是为了加快应用程序创建而设计的一种过于复杂和模糊的方法?此外,EF6 仍然存在这个问题 =( 另外,感谢这篇文章,我一直在诅咒 EF 框架,因为我每次更新时都删除并重新创建了我的 edmx。
  • 不,乔希,不仅仅是你。它过于复杂,可能会浪费数小时试图让实体框架与存储过程一起工作。为什么 EF 需要使用存储过程?因为有时这是最好的解决方案。不要误会我的意思 EF 很好,但存储过程肯定应该像表格一样容易找到,而不是像年长的亲戚那样隐藏起来。
  • 我正在使用 EF6,我遇到了同样的问题,但这个答案对我不起作用,所以我将删除并再次创建我的数据模型。
  • 谢谢!!在我的情况下,我从功能导入列表中右键单击(并选择更新)存储过程 - 不是双击!刚刚注意到您可以右键单击然后选择编辑!!!
  • 哇,在使用了 EntityFramework 几个月后,我终于解决了这个问题。我只是想如果 EF 可以节省我的时间,因为所有相关的问题和复杂性都必须研究。
【解决方案2】:

您不必编辑 edmx / xml。这样做:

当您将存储过程带入 EDMX 时(我说的是返回结果集的存储过程,但这将是一个类似的过程),创建了 3 个而不是 1 个项目,这就是问题。 (***问题的第二个来源是您必须在删除对象之后、重新导入对象之前显式保存,否则新重新导入的对象将与 edmx 中没有真正删除(通过保存)的对象发生冲突。

所以!这样做:

在模型浏览器中,通常在左侧,将存储过程的名称粘贴到搜索框中,单击输入(或搜索)。它将落在第一个实例上——可能是存储过程本身。右键单击并删除。现在,将光标放回搜索框中->按回车键或再次搜索。现在您将登陆函数导入。右键单击并删除。第三次做同样的事情——这将落在表示结果集的复杂类型上。删除它。现在你已经完成了!!!!!!!您必须保存您刚刚所做的,以便在 edmx 中写入(未写入)删除。

现在,再次获取存储过程(更新模型/选择存储过程)。现在再次单击保存。

每次都会这样。关键是确保在使用模型浏览器搜索出现在模型浏览器中的存储过程名称的所有实例时,最好不要对默认命名约定大惊小怪。第二个关键是在您完成任何步骤后保存。

【讨论】:

  • 谢谢,我一直在想如何删除/重新添加存储的过程!
  • 这行得通。要显示模型浏览器选项卡,您必须先单击 edmx 模型图。
【解决方案3】:

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

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

这就是尼尔的做法:)

【讨论】:

    【解决方案4】:

    在 XML 上进行了大量手动编辑并重新启动了几次 Visual Studio,但我终于能够让 VS 忘记以前的签名。然后我只是使用普通的 EF 向导重新添加它,它工作得很好。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 我试过了,没用。由于“更新模型...”函数实际上从未将模型与数据库同步,因此对过时的存储过程执行函数导入只是重新创建了旧签名。
        • 所以您基本上永远无法从模型中删除程序并使用新的更新程序添加回模型?
        • 正确。看起来就是这样。现在我正在尝试放弃 vs 设计器并直接编辑 XML。我们会看看效果是否更好
        • @Jeff ..好吧,如果您直接编辑设计器..据我所知,每次您对模型进行任何更改时,它都会重新生成设计器代码..我认为您应该尝试并再做一次也许关闭重新打开解决方案..尝试不同的事情..基本上你的模型和设计师应该是同步的..否则你会遇到问题..除非你转向 POCO 或类似的东西..
        【解决方案7】:

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

        【讨论】:

        • 修改了这个,上面 DaveD 的回答的第二部分实际上也对 EF4 中的问题进行了排序。
        【解决方案8】:

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

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

        删除后,您可以毫无问题地重新添加它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-15
          • 1970-01-01
          • 2016-12-02
          • 1970-01-01
          • 2014-01-25
          相关资源
          最近更新 更多