EF core 3.1 + Pomelo Scaffold-DbContext предотвращает создание кода представления - PullRequest
1 голос
/ 10 июля 2020

Недавно я обновил 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 оставался таким же, как до обновления - без представлений (пока не будет полностью протестирован) .
Как отключить эту новую функцию создания представлений?

1 Ответ

2 голосов
/ 10 июля 2020

В настоящее время эта функция не реализована в EF Core. Однако отслеживается на GitHub .

1 Общее решение

Единственный официальный способ выполнить sh то, что вы хотите, - использовать -t аргумент командной строки (или -Tables, в зависимости от инструмента) для каждой отдельной таблицы, которую вы хотите, чтобы формировал (и тем самым игнорировал все представления):

1.1 do tnet ef scaffold

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 Указанный поставщиком c решение

Вы также можете получить ваш собственный каркас из 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+ с использованием параметр строки подключения

Мы только что добавили issue и PR в наш репозиторий GitHub для этой функции.

Это будет частью 3.2.0, а также будет доступен из нашего ночного канала сборки примерно через 24 часа.

Он представляет спецификация Pomelo и scaffolding c параметр строки подключения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...