反映对Entity Framework生成的复杂类型中的存储过程所做的更改

时间:2011-07-14 12:42:41

标签: entity-framework entity-framework-4.1

所以我在SQL Server中有一个数据库,我正在连接并使用Entity Framework 4.1来生成我的POCO类,这通常很有效。还有一些存储过程,我使用“函数导入”功能来创建检索调用它们的结果数据行。基本上我正在使用的过程是:

  1. 右键单击Model.edmx并选择“Function Import ...”
  2. 从下拉列表中选择程序
  3. 输入我想要的功能导入名称
  4. 点击“获取列信息”
  5. 点击“创建新的复杂类型”
  6. 点击“确定”
  7. 这将为结果集定义创建一个POCO类,我可以执行以下操作:

    var query = context.GetMyStuff().AsQueryable();

    检索结果。这似乎工作得很好。

    现在我遇到的麻烦是当我尝试修改存储过程然后将更改传播到我的代码时。例如,我向表中添加了一个附加列,然后更新了存储过程以将该列数据作为结果的一部分返回。我没有看到如何使更新传播到函数导入的东西,即,使生成的POCO具有该添加列的新属性。

    对程序进行更新的练习反映在C#方面?我每次都要上新课吗?对我来说,如何做到这一点并不明显。


    其他信息:

    当我尝试“更新”复杂类型时,正如Ladislav对this question的回复中所建议的那样,我收到一条错误消息“验证FunctionImport名称是唯一的。”

    如果我尝试一下E.J. Brennan建议如下,我得到相同的错误信息。

    的工作原理,至少在我看来,是在Notepad ++中打开Model.edmx文件,找到FunctionImport行并删除它然后重新生成它。这不是理想的,但它确实奏效了。

5 个答案:

答案 0 :(得分:26)

(这个解决方案适用于EF 6.我没有在其他EF版本中尝试过。它运行得很好。)我支持Brennan的答案,通过举例说明让像我这样天真的编码员更清楚:)

转到模型浏览器。 MyStoreProc是存储过程的名称(作为示例)。 MyStoreProc将出现在3个地方。

  1. 第一名 - 复杂类型 - >作为MyStoreProc_result
  2. 第二名 - 功能导入 - >作为MyStoreProc
  3. 第三名 - 在存储下 程序/功能 - >作为MyStoreProc enter image description here
  4. 从模型中删除所有三个。 保存edmx(通过单击窗口然后按Ctrl + S)。然后右键单击并单击从数据库更新模型。然后添加更新的存储过程并再次保存。

    解决没有任何麻烦:)

答案 1 :(得分:9)

我通常会进入模型浏览器,在主菜单中选择View>其他Windows>实体数据模型浏览器(它通常在与解决方案资源管理器相同的面板中打开),并删除已更改的存储过程,然后重新添加。

可能会更容易,但这个适合我。

编辑:“从数据库更新模型”理论上也应该有效,但根据我的经验,它在100%的时间内不起作用,删除和重新添加似乎坚如磐石。

答案 2 :(得分:2)

在我们公司,我们过去更新SP就像SArifin的答案......虽然有效,但却有点拖累。

最近我们发现你只需要去SP功能导入 - >右键单击 - >编辑 - >更新复杂类型。

答案 3 :(得分:1)

@itsmatt - 您的解决方案适合我。简而言之,

  1. 在文本编辑器中打开文件.edmx。
  2. 找到并删除如下所示的XML节点:
  3. <FunctionImport Name="<some name>" ReturnType="Collection(dev_riskModel.GetECLExcesses_Result)">
    (additional lines. . .)
    </FunctionImport>
    
    1. 保存文件
    2. 在模型浏览器中,从数据库更新模型,重新添加存储过程
    3. 选择新添加的存储过程,然后从上下文菜单中选择“添加功能导入”项等。

答案 4 :(得分:1)

我刚刚遇到同样的问题,谢谢你的回答!我还要做的另一件事是删除模型浏览器中“复杂类型”的输出。