使桌面客户端可以使用更新的EF数据库迁移而无需更新

cl

目前,我有一个ERP,它是一个基于Winforms的客户端(带有SQL Server),可以使用ClickOnce在桌面上交付和更新它。

当前版本正在使用Entity Framework 4(基于ObjectContext)和数据库。当数据库架构发生更改时,我对客户端进行更新的方式分为四个步骤:

  1. 在生产中创建具有兼容列的中间更新数据库模式(允许在所有位置为null或具有默认值,等等)。旧客户端可以连接到该数据库并继续工作,就好像什么都没有改变一样
  2. 使用已更新的功能将桌面客户端更新为中间版本,该更新功能说明了此中间架构,但具有所有“最终架构”功能
  3. 一旦所有客户端都更新并且所有记录都与“最终”模式兼容,请使用所需的数据库约束对该模式进行新的更新
  4. 将所有客户端更新到映射到该最终模式的最终版本(该版本解决了数据库约束错误,并且需要那些模式更改才能起作用)。

我发现这个过程对我们来说比较麻烦,对客户来说比较好,他们可以在他们认为合适的时候进行更新,并且在工作中不会被更新打扰(可能涉及到拥有客户)在不想等待软件更新的人面前。

现在,我使用EF6和代码优先的迁移对客户端(仍然是Winforms)进行了几乎完全的重写。

我一直在寻找文档,但是什么也找不到(似乎现在只有Web编程,通常可以同时完成数据库和Web客户端的更新,而不会打扰用户),但是一旦将迁移应用于生产,未更新的客户端将无法再使用该数据库。如果上下文与数据库架构不是最新的,EF将在实例化上下文时进行投诉并引发异常。

特定问题:是否有一种方法可以使EF6代码优先的dbcontext与兼容的内置数据库一起工作,以进行较新的数据库模式迁移?如果是这样,我可以继续做我到目前为止所做的事情。

还有一个(我想)基于oppionion的问题,是否有人想扩展实际答案:是否有更好的方法来处理这种情况?我敢肯定我不是唯一一个遇到此问题的人,但是Google搜索文档所需的关键字范围太广,到目前为止,我的搜索只涉及到Web场景。

我目前在客户端重写的一个阶段上,可以进行重大更改,所以我不在乎解决方案是否会使部分代码复杂化

乔塔贝

当应用程序初始化模型数据库时,通过直接调用DbContext.Database.Initialize或实例化第一个数据库DbContext,它将检查应用程序中的模型与数据库中的模型是否匹配。

为此,它将计算模型哈希,并将其与__MigrationHistory表(EdmMetadata如果已从EF 4.x更新,则存储在表中)中的哈希进行比较这是在System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel方法中完成的,该方法会接收一个名为的参数,该参数throwIfNoMetadata恰好false在内部实现中,因此,如果没有元数据,则不会引发异常。

因此,如果您在初始化数据库之前以某种方式使该表消失,则可以避免该错误。重要的一点是,您必须在不使用的情况下进行此更改DbContext如果不存在,数据库将尝试初始化,如果该表存在,它将失败。因此,您可以使用PlainADO.NET删除表。

考虑到元数据表可以自动创建,例如通过应用迁移。

您还可以ctx.Database.CompatibleWithModel(true)用来检查数据库元数据是否存在以及是否兼容,以摆脱它。该参数正是throwIfNoMetadata我上面提到的。

db初始化程序中的兼容性检查:

默认的数据库初始值设定项是CreateDatabaseIfNotExists,它会检查throwIfNoMetadata设置为的模型兼容性false这就是为什么该解决方案有效的原因。但是,如果您实现自己的DB Initializer版本而不运行检查,则它将起作用。

public virtual void InitializeDatabase(TContext context)
{
    Check.NotNull(context, "context");

    var existence = new DatabaseTableChecker().AnyModelTableExists(context.InternalContext);

    if (existence == DatabaseExistenceState.Exists)
    {
        // If there is no metadata either in the model or in the database, then
        // we assume that the database matches the model because the common cases for
        // these scenarios are database/model first and/or an existing database.
        if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false, existenceState: existence))
        {
            throw Error.DatabaseInitializationStrategy_ModelMismatch(context.GetType().Name);
        }
    }
    else
    {
        // Either the database doesn't exist, or exists and is considered empty
        context.Database.Create(existence);
        Seed(context);
        context.SaveChanges();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在更新期间更新/迁移远程客户端独立数据库架构的选项

来自分类Dev

Android-使用GCM更新客户端的sqlite数据库

来自分类Dev

使用Java客户端更新远程数据库的安全方法

来自分类Dev

设置客户端到服务器(和数据库)的连接并更新客户端 html

来自分类Dev

如何使用高级安装程序更新应用程序的版本而不删除客户端数据库

来自分类Dev

Laravel雄辩的更新记录而无需从数据库加载

来自分类Dev

PHP更新数据库字段而无需重定向

来自分类Dev

PHP更新数据库字段而无需重定向

来自分类Dev

仅当新条目进入Django中的数据库时才更新客户端页面

来自分类Dev

在feathersjs应用程序之外编辑数据库时如何更新客户端

来自分类Dev

可以使用Git更新客户端计算机上的软件吗?

来自分类Dev

我可以使用“旧”代码访问已迁移的EF数据库吗?

来自分类Dev

添加一个收藏夹按钮以使用PHP中的值更新mysql数据库,而无需重新加载页面

来自分类Dev

EF迁移不会自动更新数据库

来自分类Dev

EF迁移不会自动更新数据库

来自分类Dev

在客户端中更新recyclerview项目ui,以指示服务器上的Firebase数据库已更新

来自分类Dev

使用PHP访问客户端的SQL数据库

来自分类Dev

您可以使用PowerShell压缩网络共享上的文件,而无需将其下载到客户端吗?

来自分类Dev

EF Code Frirst:在使用Code First迁移更新数据库之前,

来自分类Dev

数据库客户端抽象

来自分类Dev

使用11G客户端连接(选择,更新,插入)到Oracle数据库10G是否安全?

来自分类Dev

使用数据库客户端连接到4D数据库

来自分类Dev

连续添加| 更新| 将数据从数据库刷新到页面而无需回发

来自分类Dev

是否可以使用url直接更新数据库?(不使用php)

来自分类Dev

是否可以使用数据库优先的Entity Framework 6更新SQLite数据库文件?

来自分类Dev

以后是否可以在客户端-服务器db环境中使用嵌入式Derby数据库?

来自分类Dev

我可以在不安装 Oracle 数据库的情况下使用 Sqlplus 即时客户端吗?

来自分类Dev

我可以使用SqlBulkCopy将相同的主键更新到远程数据库吗?

来自分类Dev

我可以使用SqlBulkCopy将相同的主键更新到远程数据库吗?

Related 相关文章

  1. 1

    在更新期间更新/迁移远程客户端独立数据库架构的选项

  2. 2

    Android-使用GCM更新客户端的sqlite数据库

  3. 3

    使用Java客户端更新远程数据库的安全方法

  4. 4

    设置客户端到服务器(和数据库)的连接并更新客户端 html

  5. 5

    如何使用高级安装程序更新应用程序的版本而不删除客户端数据库

  6. 6

    Laravel雄辩的更新记录而无需从数据库加载

  7. 7

    PHP更新数据库字段而无需重定向

  8. 8

    PHP更新数据库字段而无需重定向

  9. 9

    仅当新条目进入Django中的数据库时才更新客户端页面

  10. 10

    在feathersjs应用程序之外编辑数据库时如何更新客户端

  11. 11

    可以使用Git更新客户端计算机上的软件吗?

  12. 12

    我可以使用“旧”代码访问已迁移的EF数据库吗?

  13. 13

    添加一个收藏夹按钮以使用PHP中的值更新mysql数据库,而无需重新加载页面

  14. 14

    EF迁移不会自动更新数据库

  15. 15

    EF迁移不会自动更新数据库

  16. 16

    在客户端中更新recyclerview项目ui,以指示服务器上的Firebase数据库已更新

  17. 17

    使用PHP访问客户端的SQL数据库

  18. 18

    您可以使用PowerShell压缩网络共享上的文件,而无需将其下载到客户端吗?

  19. 19

    EF Code Frirst:在使用Code First迁移更新数据库之前,

  20. 20

    数据库客户端抽象

  21. 21

    使用11G客户端连接(选择,更新,插入)到Oracle数据库10G是否安全?

  22. 22

    使用数据库客户端连接到4D数据库

  23. 23

    连续添加| 更新| 将数据从数据库刷新到页面而无需回发

  24. 24

    是否可以使用url直接更新数据库?(不使用php)

  25. 25

    是否可以使用数据库优先的Entity Framework 6更新SQLite数据库文件?

  26. 26

    以后是否可以在客户端-服务器db环境中使用嵌入式Derby数据库?

  27. 27

    我可以在不安装 Oracle 数据库的情况下使用 Sqlplus 即时客户端吗?

  28. 28

    我可以使用SqlBulkCopy将相同的主键更新到远程数据库吗?

  29. 29

    我可以使用SqlBulkCopy将相同的主键更新到远程数据库吗?

热门标签

归档