首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何首先停止实体框架代码运行“如果不存在创建模式”

如何首先停止实体框架代码运行“如果不存在创建模式”
EN

Stack Overflow用户
提问于 2022-11-25 17:11:54
回答 1查看 26关注 0票数 0

以下是有关我们的技术开发环境的信息:

64-bit

  • EntityFramework.Functions Version=1.5.0

  • Microsoft.EntityFrameworkCore.Design Version=5.0.17

  • Microsoft.EntityFrameworkCore.Tools Version=5.0.17

  • Npgsql.EntityFrameworkCore.PostgreSQL Version=5.0.10

  • .NET Core 3.1
  • PostgreSQL 14.2,由VisualC++ build 1914编写

我们使用的PostgreSQL用户帐户非常严格,因为我们只希望said帐户创建典型的数据库对象(即表、视图、函数、过程等),但我们不希望said帐户创建数据库模式。只是为了安全和让我们的环境更好的防弹。

代码语言:javascript
运行
复制
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用户帐户创建数据库模式的特权。我们只希望上述用户帐户创建典型的数据库对象(即表、视图、函数、过程等):

代码语言:javascript
运行
复制
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") );

请有人发布一个带有代码和/或命令行执行参数和/或配置更改的响应,以说明我如何阻止实体框架代码--首先不要运行“如果不存在创建模式”?

EN

回答 1

Stack Overflow用户

发布于 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);} }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74576042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档