通过EF Core + Code First +迁移创建数据库

问题描述

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

我的第一个电话是:

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':'所需的用户不存在或提供的用户名/密码无效'

我期望数据库和用户将在HasDefaultSchema调用中创建。 在这种情况下我想念什么?

解决方法

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

根据我的经验,某些数据库连接器默认包括自动创建模式,而有些则没有,例如mysql和ms可以,但是MariaDB的相同代码要求之前创建模式。

,

不幸的是,当模式不存在时,UseOracle中的optionBuilder方法不支持模式的创建。

原因是因为相对于Oracle,Sql Server或Postgres中的架构之间存在特定差异。

EnsureSchemaOperation类

一个MigrationOperation,用于确保架构存在。也就是说,仅当模式不存在时,才会创建模式。

[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 OS中的“我的文档”文件夹。用户可以向其他用户授予权限以查看其架构中的内容,但是Oracle架构本质上是用户的工作空间。

MS SQL Server的架构是名称空间。尽管您可以拥有“会计”和“市场营销”架构,但它们并没有与各个用户紧密耦合。会计模式中的对象包含会计信息,而营销模式中的对象包含营销信息。

Oracle模式与用户紧密耦合,而MS SQL Server模式主要用于分类。

在Oracle中,模式始终是用户。您可以创建两个具有相同名称的不同表,这些表属于不同的用户/方案。在SQL Server中,架构和用户是分开的。用户仅用于登录和定义权限。

我相信Microsoft并未在受影响的类的相应方法中实现CREATE USER xxx

,

提供的用户名和密码似乎有问题。请与您正在使用的oracle实例交叉检查用户名和密码。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...