#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.