标签:
链接:http://www.codeproject.com/Articles/675933/Returning-Multiple-Result-Sets-from-an-Entity-Fram
案例:下载
Details to create an entity database-first app project are described in the MSDN tutorial. Follow the steps for building the app except using the sample database described above, the StoreDBModel
for the model name, and the StoreDBEntities
for the database connection string name.
<FunctionImport Name="GetAllCategorisAndProducts" ReturnType="Collection(StoreDBModel.Category_SprocResult)" /> <FunctionImport Name="GetProductsCM" ReturnType="Collection(StoreDBModel.Product_SprocResult)" />
Change the code in the first FunctionImport
node as shown below. This is actually to merge the second return type into the first FunctionImport
node. The Type
attribute in the second ReturnType
node can easily be copied from the second FunctionImport
node. After the merging, just leave the second FunctionImport
node there as it will automatically be deleted when we do the clean-up from the Model Browser later.
<FunctionImport Name="GetAllCategorisAndProducts"> <ReturnType Type="Collection(StoreDBModel.Category_SprocResult)" /> <ReturnType Type="Collection(StoreDBModel.Product_SprocResult)" /> </FunctionImport> <FunctionImport Name="GetProductCM" ReturnType="Collection(StoreDBModel.Product_SprocResult)" />
<FunctionImportMapping FunctionImportName="GetAllCategorisAndProducts" FunctionName="StoreDBModel.Store.GetAllCategorisAndProducts"> <ResultMapping> <ComplexTypeMapping TypeName="StoreDBModel.Category_SprocResult"> <ScalarProperty Name="CategoryID" ColumnName="CategoryID" /> <ScalarProperty Name="CategoryName" ColumnName="CategoryName" /> <ScalarProperty Name="ProductCount" ColumnName="ProductCount" /> </ComplexTypeMapping> </ResultMapping> </FunctionImportMapping> <FunctionImportMapping FunctionImportName="GetProductCM" FunctionName="StoreDBModel.Store.GetProductCM"> <ResultMapping> <ComplexTypeMapping TypeName="StoreDBModel.Product_SprocResult"> <ScalarProperty Name="ProductID" ColumnName="ProductID" /> <ScalarProperty Name="ProductName" ColumnName="ProductName" /> <ScalarProperty Name="CategoryID" ColumnName="CategoryID" /> <ScalarProperty Name="StatusCode" ColumnName="StatusCode" /> <ScalarProperty Name="StatusDescription" ColumnName="StatusDescription" /> <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" /> <ScalarProperty Name="AuditTime" ColumnName="AuditTime" /> </ComplexTypeMapping> </ResultMapping> </FunctionImportMapping>
Add the ResultMapping
node from the second FunctionImportMapping
into the firstFunctionImportMapping
. Leave the entire second FunctionImportMapping
node there for now.
<FunctionImportMapping FunctionImportName="GetAllCategorisAndProducts" FunctionName="StoreDBModel.Store.GetAllCategorisAndProducts"> <ResultMapping> <ComplexTypeMapping TypeName="StoreDBModel.Category_SprocResult"> <ScalarProperty Name="CategoryID" ColumnName="CategoryID" /> <ScalarProperty Name="CategoryName" ColumnName="CategoryName" /> <ScalarProperty Name="ProductCount" ColumnName="ProductCount" /> </ComplexTypeMapping> </ResultMapping> <ResultMapping> <ComplexTypeMapping TypeName="StoreDBModel.Product_SprocResult"> <ScalarProperty Name="ProductID" ColumnName="ProductID" /> <ScalarProperty Name="ProductName" ColumnName="ProductName" /> <ScalarProperty Name="CategoryID" ColumnName="CategoryID" /> <ScalarProperty Name="StatusCode" ColumnName="StatusCode" /> <ScalarProperty Name="StatusDescription" ColumnName="StatusDescription" /> <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" /> <ScalarProperty Name="AuditTime" ColumnName="AuditTime" /> </ComplexTypeMapping> </ResultMapping> </FunctionImportMapping> <FunctionImportMapping...> . . . </FunctionImportMapping>
GetAllCategorisAndProducts_Result
to Category_SprocResult
, and the GetProductCM_Result
to Product_SprocResult
as shown below.FunctionImport
nodes under theedmx:ConceptualModels
node:FunctionImportMapping
nodes under theedmx:Mappings/../En<FunctionImportMapping
node.GetProductCM
in both Stored Procedures/Functions and Function Import lists. This will automatically delete all settings for the GetProductCM
stored procedure mappings and also the method to call the dummy stored procedure in the StoreDBModel.Context.cs file.Will the manual editing for returning multiple result sets from the stored procedure be overwritten when updating the model due to any database schema changes? Based on results of my tests using the Visual Studio 2013, all the editing changes were kept intact when adding entities or other stored procedures into, or deleting any items from, the model except for deleting or refreshing the edited stored procedure mappings.
When adding or changing the input/output parameters in the stored procedure, the updates will automatically be refreshed in the model if executing the Refresh tab from the Update Model from Database (Update Wizard) screen. For example, adding @
as an input parameter to the stored procedure,Test
nvarchar(50)
GetAllCategorisAndProducts
, in the database then refreshing the model will insert the Parameter
node into the stored procedure’s FunctionImport
node even though it was manually edited before.
<FunctionImport Name="GetAllCategorisAndProducts"> <ReturnType Type="Collection(StoreDBModel.Category_SprocResult)" /> <ReturnType Type="Collection(StoreDBModel.Product_SprocResult)" /> <Parameter Name="Test" Mode="In" Type="String" /> </FunctionImport>
Automatic refreshing stored procedure complex type mappings due to changes in returning fields is not supported in any version of the EF, even for a stored procedure returning a single result set. We need to either re-add the stored procedure to the model after dropping the stored procedure and function import mappings from the model, or manually update the complex type using the Model Browser or the XML editor.
标签:
原文地址:http://www.cnblogs.com/varorbc/p/4757471.html