使用 EF Core + Code First + 迁移创建数据库
Database creation with EF Core + Code First + migrations
对于 Entity Framework 具有代码优先和迁移功能的核心应用程序,
如果数据库不存在,我无法创建它。
我的第一个电话是:
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
调用中创建。
在这种情况下我错过了什么?
您是否检查过迁移是否包括架构的创建?
根据我的经验,一些数据库连接器默认包括自动创建模式,而有些则不包括,例如 mysql 和 ms 有,但 MariaDB 的相同代码需要先创建模式。
很遗憾,optionBuilder
中的UseOracle
方法不支持在模式不存在时创建模式。
原因是 Sql Server 或 Postgres 中的架构与 Oracle 之间存在特定差异。
EnsureSchemaOperation Class
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 OS 中的我的文档文件夹。用户可以授予其他用户查看其模式中内容的权限,但 Oracle 模式本质上是用户的工作区。
MS SQL 服务器的模式是命名空间。虽然您可以拥有 Accounting 和 Marketing 模式,但它们不是 tightly-coupled 个人用户。会计模式中的对象包含会计信息,营销模式中的对象包含营销信息。
Oracle 架构 tightly-coupled 对用户和 MS SQL 服务器架构主要用于 class 化。
在 Oracle 中,架构始终是用户。可以创建两个不同的同名表,属于不同的users/schemas。在 SQL 服务器中,架构和用户是分开的。用户仅用于登录和定义权限。
我相信微软没有在受影响的 class 的相应方法中实现 CREATE USER xxx
。
提供的用户名和密码似乎有问题。请cross-check您使用的oracle实例的用户名和密码。
对于 Entity Framework 具有代码优先和迁移功能的核心应用程序, 如果数据库不存在,我无法创建它。
我的第一个电话是:
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
调用中创建。
在这种情况下我错过了什么?
您是否检查过迁移是否包括架构的创建?
根据我的经验,一些数据库连接器默认包括自动创建模式,而有些则不包括,例如 mysql 和 ms 有,但 MariaDB 的相同代码需要先创建模式。
很遗憾,optionBuilder
中的UseOracle
方法不支持在模式不存在时创建模式。
原因是 Sql Server 或 Postgres 中的架构与 Oracle 之间存在特定差异。
EnsureSchemaOperation Class
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 OS 中的我的文档文件夹。用户可以授予其他用户查看其模式中内容的权限,但 Oracle 模式本质上是用户的工作区。
MS SQL 服务器的模式是命名空间。虽然您可以拥有 Accounting 和 Marketing 模式,但它们不是 tightly-coupled 个人用户。会计模式中的对象包含会计信息,营销模式中的对象包含营销信息。
Oracle 架构 tightly-coupled 对用户和 MS SQL 服务器架构主要用于 class 化。
在 Oracle 中,架构始终是用户。可以创建两个不同的同名表,属于不同的users/schemas。在 SQL 服务器中,架构和用户是分开的。用户仅用于登录和定义权限。
我相信微软没有在受影响的 class 的相应方法中实现 CREATE USER xxx
。
提供的用户名和密码似乎有问题。请cross-check您使用的oracle实例的用户名和密码。