2011-12-25 30 views
4

是否可以在edmx文件中持久添加手动添加的存储过程?数据库是从模型生成的。每次我在edmx文件的编辑器中更改某些内容时,存储过程都会丢失。之后只有FunctionImport条目仍然可用。在edmx文件中手动添加存储过程

一个示例函数如下:

<Function Name="SP_I_InsertGroup" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo"> 
     <Parameter Name="name" Type="nvarchar" Mode="In" /> 
     <Parameter Name="chiefId" Type="int" Mode="In" /> 
     <Parameter Name="description" Type="nvarchar" Mode="In" /> 
     <Parameter Name="parentId" Type="int" Mode="In" /> 
     <Parameter Name="mode" Type="char" Mode="In" /> 
    </Function> 

相应FunctionImportMapping:

<FunctionImportMapping FunctionImportName="InsertGroup" FunctionName="DAL.Store.SP_I_InsertGroup" /> 

FunctionImport:

 <FunctionImport Name="InsertGroup" ReturnType="Collection(Int32)"> 
     <Parameter Name="name" Mode="In" Type="String" /> 
     <Parameter Name="chiefId" Mode="In" Type="Int32" /> 
     <Parameter Name="description" Mode="In" Type="String" /> 
     <Parameter Name="parentId" Mode="In" Type="Int32" /> 
     <Parameter Name="mode" Mode="In" Type="String" /> 
     </FunctionImport> 

回答

1

哞,你不应该手动修改的EDMX文件。

“对此文件所做的更改可能会导致不正确的行为,并且如果重新生成代码将会丢失。”

这就是为什么你失去了你的工作。您应该从设计器映射已经创建的存储过程,就像您对表格所做的一样。

我假设你正在玩EF4。

+0

你提出的或多或少是个问题。我的意思是我遵循了Microsoft在http://msdn.microsoft.com/en-us/library/dd296754.aspx上描述的步骤。这导致了所描述的问题。 – niklr

+0

就像@Fergara所说的,当你使用设计器编辑EDMX文件时,它会重新生成它下面的所有文件。这就是你失去这些文件的原因。每次您编辑它们时,都必须重新替换这些文件。有关更多信息,请参阅下面的答案。 – Termato

0

如果您使用Model First并且不想从数据库生成模型,则此解决方案可以正常工作。(使用VS2013,EF6,MVC5)

打开您的EDMX文件。 右键单击并按数据库中的更新模型。 只有选中“存储过程和函数”,并在不同的是底部“导入选定存储过程和函数到实体模型”取消选中两个箱(见下面的图片)

Update Model Wizard

注意:如果你有数据注解等,它们将被重新生成并被覆盖。

参考:Using stored procedures in Entity Framework Model First Approach (Part I - Adding New Stored procedure)


进一步解释和详情:

“当实体数据模型向导生成从数据库.edmx文件,它在每个所述存储模型创建条目存储过程存储在数据库中,当创建函数导入时,相应的条目被添加到概念模型中。“ How to: Import a Stored Procedure (Entity Data Model Tools)

看起来您必须从数据库更新您的模型才能使用“添加新的>函数导入..”向导来导入存储过程。否则,它不会出现在列表中。 如果您手动添加它们,您确实有被覆盖的风险。每次编辑模型时都会发生这种情况。只要您对模型或数据库进行了更改(我会保留备份副本),您就必须保持该代码始终保持最新状态。

这里是你如何从数据库生成模型做:EF Model First with Stored Procedures

他们还引用更新从数据库模型在这个MSDN社区支持论坛:how to add new stored procedure to existing .edmx file

这是我唯一的出路我们发现无需更新模型即可更新存储过程。