Создание базы данных с помощью EF Core Code First миграции

#c# #oracle #entity-framework-core #ef-code-first #entity-framework-migrations

#c# #Oracle #entity-framework-core #ef-code-first #entity-framework-миграции

Вопрос:

В случае приложения Entity Framework Core с code first и миграциями мне не удается создать базу данных, если она не существует.

Мой первый вызов:

 using (MyDbContext context = new MyDbContext())
{
    context.Database.Migrate();
}
  

Он запускает переопределенные методы:

 // 1
protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder)
{
    optionBuilder.UseOracle($"ENLIST=dynamic;USER ID={UserId};POOLING=True;CONNECTION TIMEOUT=15;PASSWORD={Pwd};DATA SOURCE=localhost:1521/xe;CONNECTION LIFETIME=0");
}

// 2
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema(UserId);
}
  

И выдает следующее исключение:

Система.Исключение NotSupportedException: ‘Требуемый пользователь не существует или предоставлены неверные имя пользователя / пароль’

Я ожидал, что база данных и пользователь будут созданы в HasDefaultSchema вызове. Чего мне не хватает в этом случае?

Комментарии:

1. Пробовал dbContext. EnsureCretated() ?

Ответ №1:

К сожалению, UseOracle метод в optionBuilder не поддерживает создание схемы, когда схема не существует.

Причина в том, что существуют конкретные различия между тем, какой схемой является Sql Server или Postgres, по отношению к Oracle.

Обеспечивает класс Chemaoperation

Операция миграции для обеспечения существования схемы. То есть схема будет создана тогда и только тогда, когда она еще не существует.

 [System.Diagnostics.DebuggerDisplay("CREATE SCHEMA {Name}")]
public class EnsureSchemaOperation : 
Microsoft.EntityFrameworkCore.Migrations.Operations.MigrationOperation
  

Метод использует синтаксис create schema , который может быть применен к некоторым ядрам баз данных, но не в Oracle. Причина в следующем:

Инструкция CREATE SCHEMA фактически не создает схему в Oracle. Инструкция CREATE SCHEMA используется только для создания объектов (т. Е. таблиц, представлений) в вашей схеме с помощью одной инструкции SQL, вместо того, чтобы выдавать отдельные инструкции CREATE TABLE и CREATE VIEW. Вы можете управлять ими как единым целым, если используете инструкцию CREATE SCHEMA.

Схемы Oracle похожи на папки «Мои документы» в ОС Windows. Пользователь может предоставлять разрешения другим пользователям на просмотр объектов в их схеме, но схема Oracle — это, по сути, рабочее пространство пользователя.

Схемы MS SQL Server являются пространствами имен. Хотя у вас могут быть схемы учета и маркетинга, они не являются тесно связанными с отдельными пользователями. Объекты в схеме учета содержат учетную информацию, а объекты в схеме маркетинга содержат маркетинговую информацию.

Схемы Oracle тесно связаны с пользователями, а схемы MS SQL Server предназначены в первую очередь для классификации.

В Oracle схемой всегда является пользователь. Вы можете создать две разные таблицы с одинаковым именем, принадлежащие разным пользователям / схемам. В SQL Server схема и пользователь — это разные вещи. Пользователи используются только для входа в систему и определения разрешений.

Я полагаю, что Microsoft не реализовала CREATE USER xxx в соответствующем методе затронутого класса.

Ответ №2:

Вы проверили, включают ли миграции создание схемы?

По моему опыту, некоторые соединители баз данных включают автоматическое создание схемы по умолчанию, а некоторые нет, например mysql и ms, но для того, чтобы схема была создана раньше, требуется тот же код для MariaDB.

Комментарии:

1. Итак, вам пришлось самостоятельно создавать свою схему при миграции? Моя первая миграция содержит migrationBuilder.EnsureSchema(name: "MySchema") , но, похоже, она ее не создает.

Ответ №3:

Кажется, что-то не так с предоставленными именем пользователя и паролем. Пожалуйста, перепроверьте имя пользователя и пароль с используемым экземпляром oracle.