簡體   English   中英

使用 EF Core + Code First + 遷移創建數據庫

[英]Database creation with EF Core + Code First + 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:'所需用戶不存在或提供的用戶名/密碼無效'

我期待數據庫和用戶將在HasDefaultSchema調用中創建。 在這種情況下我錯過了什么?

不幸的是, optionBuilder中的UseOracle方法不支持在模式不存在時創建模式。

原因是因為 Sql 服務器或 Postgres 中的模式與 Oracle 之間存在特定差異。

EnsureSchemaOperation Class

用於確保架構存在的 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 操作系統中的“我的文檔”文件夾。 用戶可以向其他用戶授予權限以查看其架構中的內容,但 Oracle 架構本質上是用戶的工作區。

MS SQL 服務器的模式是命名空間。 雖然您可以擁有會計和營銷模式,但它們與單個用戶並沒有緊密耦合。 會計模式中的對象包含會計信息,而營銷模式中的對象包含營銷信息。

Oracle 模式與用戶緊密耦合,MS SQL 服務器模式主要用於分類。

在 Oracle 中,模式始終是用戶。 您可以創建兩個具有相同名稱的不同表,屬於不同的用戶/模式。 在 SQL 服務器中,模式和用戶是分開的。 用戶僅用於登錄和定義權限。

相信微軟沒有在受影響的class的對應方法中實現CREATE USER xxx

您是否檢查過遷移是否包括架構的創建?

根據我的經驗,一些數據庫連接器默認包括自動創建模式,而有些則不包括,例如 mysql 和 ms 這樣做,但 MariaDB 的相同代碼需要在之前創建模式。

提供的用戶名和密碼似乎有問題。 請與您正在使用的 oracle 實例交叉檢查用戶名和密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM