【问题标题】:EF core 3.1+Pomelo Scaffold-DbContext prevent view code generationEF core 3.1+Pomelo Scaffold-DbContext 防止视图代码生成
【发布时间】:2020-07-10 08:30:29
【问题描述】:

我最近从 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 与更新前一样 - 没有视图(直到经过全面测试)。
如何禁用这个新的视图生成功能?

【问题讨论】:

    标签: c# entity-framework entity-framework-core pomelo-entityframeworkcore-mysql


    【解决方案1】:

    目前,此功能未在 EF Core 中实现。但是,它是tracked on GitHub

    1 通用解决方案

    实现您想要的唯一官方方法是对您想要搭建的每个表使用-t 命令行参数(或-Tables,具体取决于工具)(从而忽略所有视图):

    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 Scaffold-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 派生出您自己的自定义脚手架并自动提供数据库的所有表,因此您不必一一指定:

    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 存储库中为此功能添加了 issuePR

    它将成为 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 Power Tools,它可以让您更轻松地制作(并保留)表格选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2018-03-06
    • 2021-01-21
    • 1970-01-01
    • 2020-04-09
    • 2018-05-22
    相关资源
    最近更新 更多