以下是有关我们的技术开发环境的信息:
64-bit
我们使用的PostgreSQL用户帐户非常严格,因为我们只希望said帐户创建典型的数据库对象(即表、视图、函数、过程等),但我们不希望said帐户创建数据库模式。只是为了安全和让我们的环境更好的防弹。
public class DatabaseContext : DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(Constants.SchemaName);
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new SuperMarketEntityTypeMap());
}
public DbSet<SuperMarket> supermarkets { get; set; }
public void SetCommandTimeout(int? timeout)
{
this.Database.SetCommandTimeout(timeout);
}
public override void Dispose()
{
base.Dispose();
}
}
public class DatabaseContextFactory : IDesignTimeDbContextFactory<DatabaseContext>
{
public DatabaseContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
optionsBuilder.UseNpgsql(x => x.MigrationsHistoryTable(
HistoryRepository.DefaultTableName, Constants.SchemaName));
return new DatabaseContext(optionsBuilder.Options);
}
}
在我的PowerShell命令行中,当我像下面这样运行一个更新时,它在尝试“如果不存在的话创建模式”时会抛出一个错误,因为我们没有授予PostgreSQL用户帐户创建数据库模式的特权。我们只希望上述用户帐户创建典型的数据库对象(即表、视图、函数、过程等):
dotnet ef database update –connection “Blah Blah Blah Connection String Blah Blah Blah”
Build started...
Build succeeded.
Failed executing DbCommand (115ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] CREATE SCHEMA IF NOT EXISTS supermarkets_schema; CREATE TABLE sendgrid_status."__EFMigrationsHistory" (
"MigrationId" character varying(150) NOT NULL,
"ProductVersion" character varying(32) NOT NULL,
CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId") );
请有人发布一个带有代码和/或命令行执行参数和/或配置更改的响应,以说明我如何阻止实体框架代码--首先不要运行“如果不存在创建模式”?
发布于 2022-11-25 19:33:14
本质上,在下面的文章中,开发人员在NpgsqlMigrationsSqlGenerator的自定义子类MyMigrationsSqlGenerator中使用一个空方法重写了NpgsqlMigrationsSqlGenerator的生成
(技术参考:https://github.com/npgsql/efcore.pg/issues/1770 )
--以上张贴的节选
这里也有同样的问题(我们正在将每个应用程序映射到一个单独的模式,模式之间有严格的隔离)。多亏了谢伊的暗示,我才得以解决这个问题:
MyMigrationsSqlGenerator(MigrationsSqlGeneratorDependencies
公共类MyMigrationsSqlGenerator: NpgsqlMigrationsSqlGenerator {公共MyMigrationsSqlGenerator依赖项,INpgsqlOptions npgsqlOptions):base(依赖项,npgsqlOptions) {}受保护的覆盖空洞生成(EnsureSchemaOperation操作、IModel模型、MigrationCommandListBuilder构建器){ //不生成模式操作,因为我们当前的权限设置}不允许它们}
然后用以下方式连接起来:
.ReplaceService()
--以上张贴的节选
为了详细说明上面的ReplaceService代码行的内容,将它放在我的IDesignTimeDbContextFactory实现中:
optionsBuilder.ReplaceService().UseNpgsql( x => x.MigrationsHistoryTable( HistoryRepository.DefaultTableName,"Blah数据库架构名称Blah"));返回新DatabaseContext(optionsBuilder.Options);} }
https://stackoverflow.com/questions/74576042
复制相似问题