![](/img/trans.png)
[英]In Entity Framework database-first approach how to return multiple result sets from a stored procedure?
[英]Entity Framework 5 stored procedure with multiple result sets
我目前正在使用asp.net mvc 4.5和EF5 Beta 2進行編碼,我有一個存儲過程,它返回多個結果集。 我找到了這個網站 ,它說新版本(我正在使用)已經支持多個結果集。
現在我似乎無法找到那種支持。 由於我完全不熟悉EF,我希望我沒有做錯事。
我的數據庫中沒有相應的實體來創建結果集。
核心EF庫支持多結果集過程。 不幸的是,設計師沒有 - 並且不清楚它是否會在發布時出現。
我也發現文檔有點稀疏,特別是對於返回多個實體類型(而不是復雜類型)。 幸運的是,手動編輯EDMX並不太復雜。 我寫了一篇關於主題的博客文章....
實體框架5 - 來自存儲過程的多個實體類型的結果集 ( 注意,我的服務器可能需要幾分鍾才能啟動磁盤,因為沒有太多的人在我的簡陋小博客上流動 )。
缺點是在CSDL部分..
<edmx:ConceptualModels>
<Schema Namespace="myModel" ...>
<EntityContainer Name="myModelEntities" ....>
......
<!--
this is what “function import” wrote, that I’m overwriting…
FunctionImport Name="MyMARS_Proc" ReturnType="Collection(myModel.Table_A)"/>
-->
<FunctionImport Name="MyMARS_Proc" >
<ReturnType Type="Collection(myModel.Table_A)" EntitySet="Table_As"/>
<ReturnType Type="Collection(myModel.Table_B)" EntitySet="Table_Bs"/>
</FunctionImport>
然后在MSL(CS Mapping部分)你會想要......
<edmx:Mappings>
<Mapping Space="C-S" ....>
<EntityContainerMapping ....>
<FunctionImportMapping FunctionImportName="MyMARS_Proc"
FunctionName="myModel.Store.MyMARS_Proc">
<ResultMapping>
<EntityTypeMapping TypeName="myModel.Table_A"/>
</ResultMapping>
<ResultMapping>
<EntityTypeMapping TypeName="myModel.Table_B"/>
</ResultMapping>
</FunctionImportMapping>
這是一個非常有趣的問題。 我玩了.NET 4.5 Beta / VS11 Beta一段時間,我有兩個觀察結果:
ResultMapping
來映射不同的結果集,並且每個ResultMapping
只能映射單個結果集 編輯:
我錯了。 它在運行時工作。 只有設計師抱怨EDMX驗證,但MSL本身接受多個ResultMapping
元素。 問題中鏈接的原始演練仍然有效。
我做了這個代碼
程序如下
alter procedure dbo.proc_getmorethanonetable
as
select * from dbo.Orders
select * from dbo.Items
select *
from dbo.Users u
inner join dbo.Orders o
on o.User_ID = u.User_ID
go
守則如此簡單我們走了
using (var db = new EF_DEMOEntities())
{
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[proc_getmorethanonetable]";
try
{
db.Database.Connection.Open();
using (var reader = cmd.ExecuteReader())
{
var orders =
((IObjectContextAdapter)db).ObjectContext.Translate<Order>(reader);
GridView1.DataSource = orders.ToList();
GridView1.DataBind();
reader.NextResult();
var items =
((IObjectContextAdapter)db).ObjectContext.Translate<Item>(reader);
GridView2.DataSource = items.ToList();
GridView2.DataBind();
}
}
finally
{
db.Database.Connection.Close();
}
}
在這里你去:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.