对于具有代码优先和迁移功能的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
调用中创建。在这种情况下我想念什么?
不幸的是,当模式不存在时,中的UseOracle
方法optionBuilder
不支持模式的创建。
原因是因为就Oracle而言,Sql Server或Postgres中的架构之间存在特定差异。
确保模式操作类
用于确保模式存在的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 OS中的“我的文档”文件夹。用户可以将权限授予其他用户以查看其架构中的内容,但是Oracle架构本质上是用户的工作区。
MS SQL Server的架构是名称空间。尽管您可以拥有“会计”和“市场营销”架构,但是它们并没有与各个用户紧密耦合。计费模式中的对象包含计费信息,而营销模式中的对象具有营销信息。
Oracle模式与用户紧密耦合,而MS SQL Server模式主要用于分类。
在Oracle中,模式始终是用户。您可以创建两个具有相同名称的不同表,这些表属于不同的用户/方案。在SQL Server中,架构和用户是分开的。用户仅用于登录和定义权限。
我相信Microsoft并未CREATE USER xxx
在受影响的类的相应方法中实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句