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