使用 EF Core + Code First + 迁移创建数据库

Database creation with EF Core + Code First + migrations

对于 Entity Framework 具有代码优先和迁移功能的核心应用程序, 如果数据库不存在,我无法创建它。

我的第一个电话是:

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);
}

并抛出以下异常:

System.NotSupportedException : 'Required user does not exists or invalid username/password provided'

我期望数据库和用户会在 HasDefaultSchema 调用中创建。 在这种情况下我错过了什么?

您是否检查过迁移是否包括架构的创建?

根据我的经验,一些数据库连接器默认包括自动创建模式,而有些则不包括,例如 mysql 和 ms 有,但 MariaDB 的相同代码需要先创建模式。

很遗憾,optionBuilder中的UseOracle方法不支持在模式不存在时创建模式。

原因是 Sql Server 或 Postgres 中的架构与 Oracle 之间存在特定差异。

EnsureSchemaOperation Class

A MigrationOperation for ensuring that a schema exists. That is, the schema will be created if and only if it does not already exist.

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

该方法使用语法create schema,可以应用于某些数据库引擎,但不适用于Oracle。原因如下:

The CREATE SCHEMA statement does NOT actually create a schema in Oracle. The CREATE SCHEMA statement is used only to create objects (ie: tables, views) in your schema in a single SQL statement, instead of having to issue individual CREATE TABLE and CREATE VIEW statements. You can control them as a single unit if you use the CREATE SCHEMA statement.

Oracle 架构类似于 Windows OS 中的我的文档文件夹。用户可以授予其他用户查看其模式中内容的权限,但 Oracle 模式本质上是用户的工作区。

MS SQL 服务器的模式是命名空间。虽然您可以拥有 Accounting 和 Marketing 模式,但它们不是 tightly-coupled 个人用户。会计模式中的对象包含会计信息,营销模式中的对象包含营销信息。

Oracle 架构 tightly-coupled 对用户和 MS SQL 服务器架构主要用于 class 化。

在 Oracle 中,架构始终是用户。可以创建两个不同的同名表,属于不同的users/schemas。在 SQL 服务器中,架构和用户是分开的。用户仅用于登录和定义权限。

我相信微软没有在受影响的 class 的相应方法中实现 CREATE USER xxx

提供的用户名和密码似乎有问题。请cross-check您使用的oracle实例的用户名和密码。