gpt4 book ai didi

c# - Entity Framework 6.1.3 从代码优先模型初始化现有但为空的数据库

转载 作者:太空宇宙 更新时间:2023-11-03 12:31:16 27 4
gpt4 key购买 nike

我在为生产系统上的发布准备应用程序时遇到了一些问题。

情况:

  • 具有多个迁移的 Entity Framework 6.1.3 代码优先模型
  • 具有专用服务用户(非本地系统)的 Windows 服务
  • 配置(由 WPF 应用程序处理)允许粘贴指向所需 MS-SQL 数据库的连接字符串
  • 数据库应由安装管理员准备,以便服务用户拥有数据库所有者、数据库编写者和数据库读取者权限。 (对于 future 的迁移应该足够了)
  • 服务用户不应该拥有 SQL-Servers masterdb 的权限。这就是为什么管理员必须在启动服务之前为 Windows 服务创建所需的数据库

我正在尝试做的事情:

  • 编写 IDatabaseInitializer ,它在检测到时初始化现有的空数据库,并在模型过时时更新数据库

我尝试了什么:

  • 使用 MigrateDatabaseToLatestVersion 初始值设定项 => 这个失败了,因为准备好的数据库中没有 __MigrationHistory 表,但是数据库是空的

  • 使用 CreateDatabaseIfNotExists 初始化器 => 这个失败了,因为数据库已经存在,这让这个初始化器什么都不做

  • 使用以下 InitializeDatabase 方法编写我自己的 IDbInitializer:

    public void InitializeDatabase(RapasiDbContext context)
    {
    if (!context.Database.Exists()) //Shouldn't happen
    {
    ... // Throw Execption: No prepared DB found
    }
    try //Initialize the existing database, but only if not already done (force:false)
    {
    context.Database.InitializeDatabase(false);
    }
    catch (Exception ex)
    {
    Log.Fatal("Error while initializing the database", ex);
    }
    try //Update the databse, if model is outdated
    {
    var dbMigrationConfig = new Configuration();
    if (dbMigrationConfig.AutomaticMigrationsEnabled && !context.Database.CompatibleWithModel(true))
    {
    Log.Info("database schame outdated, starting migration!");
    try
    {
    var migrator = new DbMigrator(dbMigrationConfig);
    migrator.Update();
    }
    catch (Exception ex)
    {
    Log.Fatal("Error while migrating the database", ex);
    }
    }
    }
    catch (Exception ex)
    {
    Log.Fatal("No Migration-Histroy found!", ex);
    }
    }

问题

  • 按照我现在尝试的方式,它根本没有调用 Initializer
  • 切换到 InitializeDatabase(force:true) 可以递归调用我自己的 InitializeDatabase 方法 :(

问题:

如何使用迁移中的 InitialCommit-Up() 脚本初始化现有数据库?

或者我错过了一些非常明显的点,为什么这种数据库初始化不应该发生?对于我的情况,是否有任何我不知道的最佳做法?

最佳答案

MigrateDatabaseToLatestVersion 初始化程序应该可以工作,即使没有 __MigrationHistory 表。它应该在第一次运行迁移时创建。

正如您在原始问题的评论中所说,在调用 SetInitializer 方法时,您需要为 MigrateDatabaseToLatestVersion 的构造函数参数提供正确的值:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<RapasiDbContext, Configuration>(true, new Configuration()));

作为the reference page表示,构造函数中的 bool 参数指定是否使用触发初始化的上下文中的连接信息来执行迁移。如果缺少此参数,将从使用默认构造函数或注册工厂构造的上下文中获取连接信息(这可能不是您需要的)。

此外,我认为您可能错误地解释了 AutomaticMigrations 配置。这并不意味着您的迁移将自动应用,这意味着如果您在模型更改后未手动运行 Add-Migration,它们将自动生成。我想您希望在您的数据库不是最新时执行挂起的迁移,即使禁用了 AutomaticMigrations。

关于c# - Entity Framework 6.1.3 从代码优先模型初始化现有但为空的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42644493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com