EF core 3.1+Pomelo Scaffold-DbContext防止视图代码生成
EF core 3.1+Pomelo Scaffold-DbContext prevent view code generation
我最近从 EF core 3.0 升级到 3.1.1,还有 Pomelo 适配器和工具。
但是,在更新之后,Scaffold-DbContext
命令现在也会为所有视图生成代码。
Scaffold-DbContext -Connection name=SystemDatabase -Provider Pomelo.EntityFrameworkCore.MySql -Force -Context MyDbContext -Project Test.Data
我希望生成的 DbContext 与更新前保持一致 - 没有视图(直到完全测试)。
如何禁用这个新的视图生成功能?
目前,此功能未在 EF Core 中实现。但是,它正在 tracked on GitHub.
1 通用解决方案
完成你想要的唯一正式方法是对每个table你想要搭建脚手架(从而忽略所有视图):
1.1 dotnet ef 脚手架
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb; Database=Blogging; Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -t Blog -t Post --context-dir Context -c BlogContext --context-namespace New.Namespace
1.2 脚手架-DbContext
Scaffold-DbContext "Server=(localdb)\mssqllocaldb; Database=Blogging; Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext -ContextNamespace New.Namespace
2 提供商特定解决方案
您还可以从 MySqlDatabaseModelFactory
派生您自己的自定义脚手架并自动提供数据库的所有 table,因此您不必一一指定它们:
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Scaffolding;
using Microsoft.EntityFrameworkCore.Scaffolding.Metadata;
using Microsoft.Extensions.DependencyInjection;
using MySql.Data.MySqlClient;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal;
using Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal;
#pragma warning disable EF1001
namespace IssueConsoleTemplate
{
public class CustomMySqlDesignTimeServices : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
=> serviceCollection
.AddSingleton<IDatabaseModelFactory, CustomMySqlDatabaseModelFactory>();
}
public class CustomMySqlDatabaseModelFactory : MySqlDatabaseModelFactory
{
public CustomMySqlDatabaseModelFactory(
IDiagnosticsLogger<DbLoggerCategory.Scaffolding> logger,
IMySqlOptions options)
: base(logger, options)
{
}
public override DatabaseModel Create(
string connectionString,
DatabaseModelFactoryOptions options)
{
//Debugger.Launch();
var tables = new HashSet<string>();
using (var connection = new MySqlConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = @"SELECT `TABLE_NAME`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE `TABLE_SCHEMA` = SCHEMA() AND `TABLE_TYPE` = 'BASE TABLE';";
using (var dataReader = command.ExecuteReader())
{
while (dataReader.Read())
{
tables.Add(dataReader.GetString("TABLE_NAME"));
}
}
}
}
return base.Create(
connectionString,
new DatabaseModelFactoryOptions(tables));
}
}
internal static class Program
{
private static void Main()
{
}
}
}
3 使用连接字符串选项的 Pomelo 3.2.0+ 解决方案
我们刚刚在 GitHub 存储库中为此功能添加了一个 issue and a PR。
它将成为 3.2.0
版本的一部分,也将在大约 24 小时内从我们的 nightly build feed 中提供。
它引入了 Pomelo 和脚手架特定的连接字符串选项 Scaffold:Views=off
,可以将其设置为命令行的一部分:
dotnet ef dbcontext scaffold "server=127.0.0.1; uid=root; pwd=; database=So62830251; Scaffold:Views=off" Pomelo.EntityFrameworkCore.MySql -c Context
我最近从 EF core 3.0 升级到 3.1.1,还有 Pomelo 适配器和工具。
但是,在更新之后,Scaffold-DbContext
命令现在也会为所有视图生成代码。
Scaffold-DbContext -Connection name=SystemDatabase -Provider Pomelo.EntityFrameworkCore.MySql -Force -Context MyDbContext -Project Test.Data
我希望生成的 DbContext 与更新前保持一致 - 没有视图(直到完全测试)。
如何禁用这个新的视图生成功能?
目前,此功能未在 EF Core 中实现。但是,它正在 tracked on GitHub.
1 通用解决方案
完成你想要的唯一正式方法是对每个table你想要搭建脚手架(从而忽略所有视图):
1.1 dotnet ef 脚手架
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb; Database=Blogging; Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -t Blog -t Post --context-dir Context -c BlogContext --context-namespace New.Namespace
1.2 脚手架-DbContext
Scaffold-DbContext "Server=(localdb)\mssqllocaldb; Database=Blogging; Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext -ContextNamespace New.Namespace
2 提供商特定解决方案
您还可以从 MySqlDatabaseModelFactory
派生您自己的自定义脚手架并自动提供数据库的所有 table,因此您不必一一指定它们:
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Scaffolding;
using Microsoft.EntityFrameworkCore.Scaffolding.Metadata;
using Microsoft.Extensions.DependencyInjection;
using MySql.Data.MySqlClient;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal;
using Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal;
#pragma warning disable EF1001
namespace IssueConsoleTemplate
{
public class CustomMySqlDesignTimeServices : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
=> serviceCollection
.AddSingleton<IDatabaseModelFactory, CustomMySqlDatabaseModelFactory>();
}
public class CustomMySqlDatabaseModelFactory : MySqlDatabaseModelFactory
{
public CustomMySqlDatabaseModelFactory(
IDiagnosticsLogger<DbLoggerCategory.Scaffolding> logger,
IMySqlOptions options)
: base(logger, options)
{
}
public override DatabaseModel Create(
string connectionString,
DatabaseModelFactoryOptions options)
{
//Debugger.Launch();
var tables = new HashSet<string>();
using (var connection = new MySqlConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = @"SELECT `TABLE_NAME`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE `TABLE_SCHEMA` = SCHEMA() AND `TABLE_TYPE` = 'BASE TABLE';";
using (var dataReader = command.ExecuteReader())
{
while (dataReader.Read())
{
tables.Add(dataReader.GetString("TABLE_NAME"));
}
}
}
}
return base.Create(
connectionString,
new DatabaseModelFactoryOptions(tables));
}
}
internal static class Program
{
private static void Main()
{
}
}
}
3 使用连接字符串选项的 Pomelo 3.2.0+ 解决方案
我们刚刚在 GitHub 存储库中为此功能添加了一个 issue and a PR。
它将成为 3.2.0
版本的一部分,也将在大约 24 小时内从我们的 nightly build feed 中提供。
它引入了 Pomelo 和脚手架特定的连接字符串选项 Scaffold:Views=off
,可以将其设置为命令行的一部分:
dotnet ef dbcontext scaffold "server=127.0.0.1; uid=root; pwd=; database=So62830251; Scaffold:Views=off" Pomelo.EntityFrameworkCore.MySql -c Context