对于具有代码优先和迁移功能的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
调用中创建。
在这种情况下我想念什么?
答案 0 :(得分:1)
您是否检查了迁移是否包括架构的创建?
根据我的经验,某些数据库连接器默认包括自动创建模式,而有些则没有,例如mysql和ms可以,但是MariaDB的相同代码要求之前创建模式。
答案 1 :(得分:1)
不幸的是,当模式不存在时,UseOracle
中的optionBuilder
方法不支持模式的创建。
原因是因为相对于Oracle,Sql Server或Postgres中的架构之间存在特定差异。
EnsureSchemaOperation类
一个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
。
答案 2 :(得分:0)
提供的用户名和密码似乎有问题。请与您正在使用的oracle实例交叉检查用户名和密码。