我试图在EFCore中使用Scaffolding来对抗mysql数据库,其中生成的代码将在Linux CentOS(NetCoreApp框架)上运行。我正在使用VS2015 Update3在Windows上进行开发。
表已成功进行逆向工程,但不包括存储过程。没有存储过程,我担心我们不得不抛弃EFCore。
作为一个示例,我开始使用一个带有单个表和无参数存储过程的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
在运行脚手架之后,在我的实际情况和简单测试用例中,生成的代码只包含表,并且不包含存储过程。
答案 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();