簡體   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