在.net核心和pomelo驱动程序上使用EF Core搭建mysql时缺少存储过程

时间:2017-01-11 16:09:11

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

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

表已成功进行逆向工程,但不包括存储过程。没有存储过程,我担心我们不得不抛弃EFCore。

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

作为一个示例,我开始使用一个带有单个表和无参数存储过程的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

在运行脚手架之后,在我的实际情况和简单测试用例中,生成的代码只包含表,并且不包含存储过程。

2 个答案:

答案 0 :(得分:0)

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;

答案 1 :(得分:0)

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