【问题标题】:missing stored procs when scaffolding mysql using EF Core on .net core and pomelo drivers在 .net 核心和 pomelo 驱动程序上使用 EF Core 搭建 mysql 时缺少存储过程
【发布时间】:2017-05-26 12:27:16
【问题描述】:

我正在尝试针对 mysql 数据库使用 EFCore 中的 Scaffolding,生成的代码将在 Linux CentOS(NetCoreApp 框架)上运行。我正在使用 VS2015 Update3 在 Windows 上进行开发。

表已成功逆向工程,但不包括存储过程。如果没有存储过程,恐怕我们将不得不放弃 EFCore。


  • EFCore 中针对 mysql 的脚手架是否支持逆向工程存储过程?
  • 使用任何驱动程序组合?
  • 假设目前 EFCore 没有此功能,您是否知道任何解决方案(付费或无偿)来完成此任务 - 对现有的 mysql 数据库进行逆向工程以在 CentOS 上的 netcoreapp 中使用?

作为一个示例,我从一个带有单个表和一个无参数存储过程的 mysql 数据库开始。我想我正在使用最新的 EFCore 和 Pomelo 驱动程序,如下面的 project.json 所示...

{
  "version": "1.1.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"
  },

  "dependencies": {
    "Microsoft.EntityFrameworkCore.Design": "1.1.0",
    "Pomelo.EntityFrameworkCore.MySql": "1.1.1-prerelease-10011",
    "Pomelo.Data.MySql": "1.0.0",
    "Pomelo.EntityFrameworkCore.MySql.Design": "1.1.1-prerelease-10011",
    "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"
  },

  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0-*"
        }
      }
    }
  }
}

在执行dotnet restore 之后,使用以下命令调用脚手架...

Scaffold-DbContext "server=localhost;user id=root;password=;database=simpledb" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -force

脚手架运行后,无论是我的真实案例还是简单的测试案例,生成的代码都只包含表,不包含存储过程。

【问题讨论】:

    标签: mysql stored-procedures .net-core entity-framework-core


    【解决方案1】:

    Pomelo 和最新版本的 Entity Framework 存在一个已知问题。

    这个配置对我有用:

    Microsoft.EntityFrameWorkCore 2.0.3
    Microsoft.EntityFrameworkCore.Tools 2.0.3
    Pomelo.EntityFrameworkCore.MySql 2.0.1
    

    要在 MySql 中调用存储过程,您可以使用类似的方法:

    var values = _context.Test.FromSql("call test_proc2(0)").ToList();
    

    【讨论】:

    • 现在它可以与 EntityFramework 的 las 版本一起工作。
    【解决方案2】:

    EF Core 不支持存储过程。

    选项 #1:FromSQL 一起使用并配置执行存储过程所需的所有内容。最简单的情况是你根本没有参数:

    var blogs = context.Blogs
        .FromSql("EXECUTE dbo.GetMostPopularBlogs")
        .ToList();
    

    选项 #2: 使用一些包装器(已经有很多实现),它们允许以流畅的方式配置存储过程调用。例如,EFCore-FluentStoredProcedure 看起来像这样:

    执行存储过程

    var dbContext = GetDbContext();
    dbContext.LoadStoredProc("dbo.SomeSproc")
        .WithSqlParam("fooId", 1)
        .ExecuteStoredProc((handler) =>
        {
            var fooResults = handler.ReadToList<FooDto>();
            // do something with your results.
        });
    

    处理多个结果集

    var dbContext = GetDbContext();
    dbContext.LoadStoredProc("dbo.SomeSproc")
        .WithSqlParam("fooId", 1)
        .ExecuteStoredProc((handler) =>
        {
            var fooResults = handler.ReadToList<FooDto>();
            handler.NextResult();
            var barResults = handler.ReadToList<BarDto>();
            handler.NextResult();
            var bazResults = handler.ReadToList<BazDto>()
        });
    

    处理输出参数

    var dbContext = GetDbContext();
    dbContext.LoadStoredProc("dbo.SomeSproc")
        .WithSqlParam("fooId", 1)
        .WithSqlParam("myOutputParam", (dbParam) =>
        {
            dbParam.Direction = System.Data.ParameterDirection.Output;
            dbParam.DbType = System.Data.DbType.Int32;
            outputParam = dbParam;
        })
        .ExecuteStoredProc((handler) =>
        {
            var fooResults = handler.ReadToList<FooDto>();
            handler.NextResult();
            var barResults = handler.ReadToList<BarDto>();
            handler.NextResult();
            var bazResults = handler.ReadToList<BazDto>()
    
        });
    
    int outputParamValue = (int)outputParam?.Value;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2016-12-14
      相关资源
      最近更新 更多