gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:18:15 26 4
gpt4 key购买 nike

对于具有代码优先和迁移的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com