使用EF 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);
}

并抛出以下异常:

System.NotSupportedException:"所需用户不存在或提供了无效的用户名/密码">

我希望数据库和用户将在HasDefaultSchema调用中创建。在这种情况下,我缺少什么?

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

原因是SqlServer或Postgres中的模式与Oracle中的模式存在特定差异。

确保架构操作类

用于确保架构存在的迁移操作。也就是说,如果且仅当该模式不存在时,才会创建该模式。

[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的架构是命名空间。虽然您可以拥有Accounting和Marketing模式,但它们并没有与单个用户紧密耦合。会计架构中的对象包含会计信息,而市场营销架构中的目标包含市场营销信息。

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

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

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

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

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

用户名&提供了密码。请交叉检查用户名&您正在使用的oracle实例的密码。

最新更新