繁体   English   中英

EF core 3.1+Pomelo Scaffold-DbContext 防止视图代码生成

[英]EF core 3.1+Pomelo Scaffold-DbContext prevent view code generation

我最近从 EF 核心 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 中实现。 但是,它正在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 存储库中为此功能添加了一个问题和一个PR

它将成为3.2.0版本的一部分,也可以在大约 24 小时内从我们的夜间构建提要中获得。

它引入了 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM