对于带有代码优先和迁移的实体框架核心应用程序,如果数据库不存在,我就无法创建它。
我的第一个电话是:
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
调用中创建。我在这个案子里漏掉了什么?
发布于 2020-08-21 05:47:17
不幸的是,当模式不存在时,UseOracle
方法在optionBuilder
中不支持模式的创建。
原因是,对于Oracle,Server或Postgres中的模式之间存在着特定的差异。
EnsureSchemaOperation类
用于确保架构存在的MigrationOperation。也就是说,架构将被创建当且仅当它还不存在。
[System.Diagnostics.DebuggerDisplay("CREATE SCHEMA {Name}")]
public class EnsureSchemaOperation :
Microsoft.EntityFrameworkCore.Migrations.Operations.MigrationOperation
该方法使用语法create schema
,可以应用于某些数据库引擎,但不能在Oracle中应用。原因如下:
-- CREATE语句实际上并不在Oracle中创建架构。CREATE语句仅用于在单个SQL语句中创建模式中的对象(即:表、视图),而不必发出单个create和CREATE语句。如果使用CREATE语句,则可以将它们作为一个单元控制。
Oracle架构与Windows操作系统中的“我的文档”文件夹类似。用户可以向其他用户授予查看其架构中的内容的权限,但Oracle架构实际上是用户的工作区。
MS的架构是命名空间。虽然您可以拥有会计和市场营销模式,但它们并不是与单个用户紧密耦合的。会计模式中的对象包含会计信息,营销模式中的对象具有营销信息。
Oracle模式与用户紧密耦合,MS SQL Server模式主要用于分类。
在Oracle中,架构始终是用户。您可以创建两个同名的不同表,它们属于不同的用户/架构。在Server中,架构和用户是分开的。用户只用于登录和定义权限。
我相信微软没有在受影响类的相应方法中实现CREATE USER xxx
。
发布于 2020-08-17 08:45:18
您是否检查过迁移是否包括模式的创建?
根据我的经验,一些数据库连接器默认情况下包括模式的自动创建,有些则不包括,例如mysql和ms做的,但是MariaDB的相同代码需要在前面创建模式。
发布于 2020-08-23 20:58:46
提供的用户名和密码似乎有问题。请交叉检查用户名和密码与您正在使用的oracle实例。
https://stackoverflow.com/questions/63398380
复制相似问题