具有多个结果集的实体框架 5 存储过程

本文关键字:实体 框架 存储过程 结果 | 更新日期: 2023-09-27 18:32:07

我目前正在使用 mvc 4.5 和 EF5 Beta 2 编码 asp.net 并且我有一个返回多个结果集的存储过程。我找到了这个网站,它说较新的版本(我正在使用的)已经支持多个结果集。

现在我似乎找不到这种支持。由于我对 EF 完全是新手,我希望我没有做错什么。

我的数据库中没有用于创建的结果集的相应实体。

具有多个结果集的实体框架 5 存储过程

核心 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(C-S 映射部分)中,您将需要...

<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,我有两个观察结果:

  • 设计器中似乎不支持多个结果集 - 所有内容都必须在以 XML 形式打开的 EDMX 中手动映射
  • 看起来之前关于 2011 年 6 月 CTP 的文章不再有效,因为 MSL 不允许声明多个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();
                       }
                       }

你来:)