【问题标题】:Entity Framework 6 and MySql error in double looping select and datareader双循环选择和数据读取器中的实体框架 6 和 MySql 错误
【发布时间】:2015-12-31 16:48:32
【问题描述】:

我正在观看有关 EF 6 + MySql 的视频课程,到目前为止这很容易,但现在我遇到了一个简单的代码问题,我已经花了 8 小时在上面,但还没有解决方案。错误出现在“cli.contatos”中的第二个 Foreach 上:

        var db = new apagartesteentityEntities(); // create model

        // runs the read on "clientes" table
        foreach (var cli in db.clientes) 
        {
            Console.WriteLine(cli.NomeClientes);

            // runs a read in "contatos" table looking for relations
            foreach (var cont in cli.contatos)                 {// <--error 
                Console.WriteLine(cont.TipoContato);
                Console.WriteLine(cont.ValorContato);
            }

        }
        Console.Read();

所以这里是代码,在视频课上完全一样,但是“老师”使用 SqlServer 而我使用 MySql。 “异常”表示已经打开了一个必须关闭的 DataReader,但它对我没有帮助。

-我已经更新了 MySql 连接器和 MySql Visual Studio -已经覆盖了dll - 在创建模型之前,已经开始从 nuget 更新 EntityFramework、MySql.Data、MySql.Entity 的项目。

我现在开始使用 EF 6,所以任何帮助都将不胜感激。谢谢

【问题讨论】:

    标签: mysql entity-framework visual-studio visual-studio-2013 entity-framework-6


    【解决方案1】:

    SQL Server 支持称为多个活动结果集 (MARS) 的功能,MySQL 不支持此功能,因此您看到的错误是预期的。您需要打开第二个连接并在内循环中运行第二个查询。

    【讨论】:

      【解决方案2】:

      谢谢!我永远不会怀疑这样的事情!看,我照你说的做了,改变了代码,所以现在我猜它正在工作(直到现在还可以),如果你有一些提示我可以接受,我还不是程序员,我什至不会说英语,但真的谢谢!我将“回答”intead 评论,以便向可能需要它的其他人展示代码。

              var db = new apagartesteentityEntities();
              contatos con = new contatos();
      
              foreach (var cli in db.clientes)
              {
                  Console.WriteLine("Nome do cliente: "+ cli.NomeClientes);
      

      // 第二个模型/连接“在使用中”,所以它在循环中“死”(我猜)

                  using(var db2 = new apagartesteentityEntities())               
                  { 
                  // MySql Nao suporta MARS (multiple actives result set)
                  foreach (var cont in db2.contatos) 
                  {
                      if (cont.IdClientes == cli.IdClientes) {  // reads IF the FK matches the PK
                      Console.WriteLine("Tipo contato: "+cont.TipoContato);
                      Console.WriteLine("Valor do contato: "+cont.ValorContato);
                      }
                  }
                  }
              Console.WriteLine("--------------------");
              }
              Console.Read();
      

      【讨论】:

      • 我对 EF 编码不是很熟悉,所以我不确定这样做的正确方法,但我认为你应该将 Where 放在内部循环中,否则你会得到所有的 contatos每次都从数据库中获取,然后遍历它们以匹配客户。代码可能类似于foreach (var cont in db2.contatos.Where(co =&gt; co.IdClientes == cli.IdClientes)) { ... }
      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多