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

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

对于具有代码优先和迁移的 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 : 'Required user does not exists or invalid username/password provided'

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

最佳答案

遗憾的是,optionBuilder 中的 UseOracle 方法不支持在架构不存在时创建架构。

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

EnsureSchemaOperation 类

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

MS SQL Server 的模式是命名空间。虽然您可以拥有会计和营销模式,但它们并不与单个用户紧密耦合。会计架构中的对象包含会计信息,营销架构中的对象包含营销信息。

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

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

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

关于c# - 使用 EF Core + Code First + 迁移创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63398380/

相关文章:

oracle - 在 BLOB 上使用 DBMS_LOB.SUBSTR 导致 ORA-06502

oracle - 如何翻译 Apex 中的默认错误消息?

c# - 尚未注册类型 'Microsoft.AspNetCore.Hosting.IHostingEnvironment' 的服务

c# - 在 C# 中解码 PCX 图像以显示为位图

c# - 使用 ASP.NET 在 Windows Azure Blob 存储上设置 CORS

oracle - Hibernate逆向工程师(oracle)将NUMBER转换为零精度big_decimal

.net Core() 上的 Postgresql 存储过程

sql - 当 WHERE 子句返回高比例的行时,Azure SQL 查询性能会显着降低

c# - 在运行时更改按钮名称和事件处理

c# - 在运行时将 TextEdit 添加到 DevExpress GridView 的列