【问题标题】:Entity Framework 5 stored procedure with multiple result sets具有多个结果集的 Entity Framework 5 存储过程
【发布时间】:2012-04-25 10:43:09
【问题描述】:

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

现在我似乎找不到那种支持。由于我对 EF 还很陌生,我希望我没有做错什么。

我的数据库中没有与创建的结果集对应的实体。

【问题讨论】:

  • 您是使用代码优先还是数据库优先 (EDMX)?
  • 哎呀,我好像忘了包括那个;我首先使用数据库(.edmx)
  • Here 它仍然被称为新功能...

标签: c# entity-framework asp.net-mvc-4 entity-framework-5


【解决方案1】:

核心 EF 库支持多结果集过程。不幸的是,设计师没有——而且目前还不清楚它是否会在发布时。

我也发现文档有点稀疏,特别是返回多个实体类型(而不是复杂类型)。幸运的是,手动编辑 EDMX 并不太复杂。我写了一篇关于主题的博文......

Entity Framework 5 – Multiple Entity-Typed Result Sets from a Stored Procedure注意,我的服务器可能需要几分钟才能启动磁盘,因为没有太多人访问我简陋的小博客)。

它的缩写在 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>

【讨论】:

    【解决方案2】:

    这是一个非常有趣的问题。我使用 .NET 4.5 Beta / VS11 Beta 玩了一段时间,我有两个观察结果:

    • 设计器中似乎不支持多个结果集 - 必须在以 XML 格式打开的 EDMX 中手动映射所有内容
    • 之前关于 2011 年 6 月 CTP 的文章似乎不再有效,因为 MSL 不允许声明多个 ResultMapping 以映射不同的结果集,并且每个 ResultMapping 只能映射单个结果集

    编辑:

    我错了。它在运行时工作。只有设计师抱怨 EDMX 验证,但 MSL 本身接受多个 ResultMapping 元素。问题中链接的原始演练仍然有效。

    【讨论】:

      【解决方案3】:

      我做了这个代码

      流程如下

                 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();
                             }
                             }
      

      你去吧:)

      【讨论】:

      • 感谢您的回复,但这并不是真正的 EF。这只是您使用模型的旧方式,但仍然有大量代码。
      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多