如何在不使用更新数据库的情况下生成启用了迁移的 EF6 数据库?

2023-11-21

在 EF5 中,我依赖于这样一个事实:我可以使用以下命令从模型重新创建数据库Database.CreateIfNotExists()

我会根据需要生成迁移,但永远不会将它们签入源代码管理(因为它们往往是开发周期的工件),然后每个开发人员都会根据需要从模型中删除并重新创建自己的数据库。

然后,我们将通过比较代码分支来生成迁移,并获取 SQL,以应用于生产或其他共享数据库。

此工作流程似乎不再有效,因为在启用迁移时,如果不首先生成所有迁移然后调用 update-database,则无法从头开始生成数据库。由于调用 add-migration 会修改 csproj 文件,这使得我的脚本(允许我们轻松切换分支)无法使用。

已为上下文“ApplicationDbContext”启用迁移,但数据库不存在或不包含映射表。使用迁移创建数据库及其表,例如通过从包管理器控制台运行“Update-Database”命令。

有没有办法恢复到 EF5 行为,其中 Database.Create 将创建当前版本的数据库?


我使用 CreateDatabaseIfNotExists 来初始化数据库,并能够使用更新数据库并运行我的应用程序,如果数据库尚不存在,它将创建该数据库。这似乎在 EF 6.0.x 中已被破坏。

这很有用,但不是我用过的。

我所做的就是放弃现有的初始化代码,并将其替换为 Global.asax 中的以下代码。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
        using (MyContext temp = new MyContext())
        {
            temp.Database.Initialize(true);
        }

注意:MyContext 是我使用的上下文,Configuration 是启用迁移时创建的配置文件。

我看过很多帖子,人们对此有疑问,但描述解决方案的帖子并不多。我不知道为什么这么多人,包括我自己,都错过了这个重大改变......(如果有关于这个的描述,我从来没有看到它,直到为时已晚。)

Edit:

这是我添加到上下文类中的代码。我不像以前那样喜欢它,但它现在可以完成工作了。请参阅@Doug 对 OP 关于在 CodePlex 上投票的评论。

private static readonly Object syncObj = new Object();
public static bool InitializeDatabase()
{
    lock (syncObj)
    {
        using (var temp = new TbdContext())
        {
            ObjectContext oc = null;
            try
            {
                oc = temp.ObjectContext;
            }
            catch (Exception ex)
            {
                //Ignore error
                Console.WriteLine(ex);
            }

            if (oc != null && oc.DatabaseExists())
            {
                return true;
            }
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<TbdContext, Configuration>());
            try
            {
                temp.Database.Initialize(true);
                return true;
            }
            catch (DataException ex)
            {

        }
    }
}

然后在我的 Global.asax.cs Application_Start() 中我这样做:

if (databaseInitialized == false)
    databaseInitialized = MyContext.InitializeDatabase();

Edit:

我升级到 EF 6.1,发现这不再起作用了。(https://stackoverflow.com/a/22770517/2033294)这是我修复它的方法:

    private static readonly Object syncObj = new Object();
    public static bool InitializeDatabase()
    {
        lock (syncObj)
        {
            using (var temp = new MyContext())
            {
                if (temp.Database.Exists()) return true;

                var initializer = new MigrateDatabaseToLatestVersion<MyContext, Configuration>();
                Database.SetInitializer(initializer);
                try
                {
                    temp.Database.Initialize(true);
                    return true;
                }
                catch (Exception ex)
                {
                    //Handle Error in some way
                    return false;
                }
            }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用更新数据库的情况下生成启用了迁移的 EF6 数据库? 的相关文章

随机推荐

  • PHP 中的 SQL Server 存储过程输出参数

    我需要帮助在 PHP 中从 SQL Server 运行存储过程 PHP 运行在 Unix Linux 服务器上 我们无法在 PHP 中返回 OUTPUT 变量 以下是PHP代码 conn mssql connect server user
  • 在 HTML 中嵌入 Ruby 代码?

    在 PHP 中 可以这样做
  • 使用 Visual Studio 2012 编译 C 应用程序

    我计划使用 Microsoft Visual Studio 2012 用 C 语言编写应用程序 问题是我找不到在编辑器中正确编译它的方法 我找到了这个解决方案http msdn microsoft com en us library bb3
  • 谷歌地图错误:哎呀!出了些问题。此页面未正确加载 Google 地图

    第一次在stackoverflow上提问 所以如果我违反了一些规则 请耐心等待 尽我最大努力自己解决寻找解决方案 但没有运气 我使用了一个工具来帮助我自定义具有多个标记位置和样式的谷歌地图 代码如下 我在本地和我自己的域上对其进行了测试 并
  • 显式引用限定转换运算符模板的实际应用

    给定以下转换运算符 struct A template
  • 使用 apscheduler 构建 Pyinstaller 3.3.1 和 3.4.0-dev

    问候 我正在尝试使用 PyInstaller 进行构建 配置 Python 3 6 5 pip 10 0 1 OS Ubuntu 18 04 Using virtualenv 也尝试过python m venv 我的应用程序使用apsche
  • 通过 Windows Live ID 登录桌面应用程序

    我想为我的桌面应用程序创建一个登录表单 用户可以使用 Windows Live ID 来实现此目的 我创建一个应用程序管理 dev live com并使用桌面实施部分 I use a WebBrowser控制并导航到给定地址 但我不知道如何
  • 如何获取字符串数组中的 Logger 值

    我用的是log4j Logger我已使用以下命令将日志值写入文件中FileAppender 现在我想在文本区域中显示日志值 如何将记录器值分配给字符串数组 您可以添加一个额外的Appender给你的Logger Use a 作家追加者写信给
  • 无法信任 iPhone 上的自签名证书

    我目前正在尝试使用自签名证书连接到服务器 我正在使用 NSURLConnection 连接到服务器 如何确保我只信任正确的服务器并取消所有其他连接 我正在使用以下代码 void connection NSURLConnection conn
  • 选择并分组

    我的查询是这样的 Select a abc a cde a efg a agh c dummy p test max b this sum b sugar sum b bucket sum b something 接下来是一些外连接和内连接
  • TPL 数据流:有限容量并等待完成

    为了简单起见 下面我将现实生活中的场景复制为 LINQPad 脚本 var total 1 1000 1000 var cts new CancellationTokenSource var threads Environment Proc
  • weblogic增加内存的方法

    我需要增加 weblogic 的内存 我是这方面的新手 我不知道如何 我需要设置 Xss 4096k 我怎样才能做到呢 Xss是Thread Stack Size 不是内存大小 您可以通过更改参数 Xmx 来更改内存大小 最重要的参数是 X
  • 在 ASP.NET Core 中使用源自 Microsoft.AspNet.Web.Optimization (.net-framework) 的“脚本”和“样式”

    我有一个简单的 ASP NET MVC 项目 需要将其移植到 ASP NET Core 在视图 cshtml 中我发现了类似的元素 Styles Render or Scripts Render Styles Render Content
  • 如何在 Google 电子表格上列出 Google 云端硬盘文件夹中的所有文件

    我有一个包含超过 2000 个文件的文件夹 我需要在谷歌电子表格上列出所有这些文件 我在网上找到了一些脚本 但它们并没有完全工作 当我点击 RUN 时 我只得到 250 个文件的列表 在 Google 开发者页面上阅读时 我发现了一些有关启
  • 具有两个标题行的表排序器

    我正在使用表排序器 jquery 插件我的表格标题中有两行 有什么方法可以在我的表上启用排序吗 它应该能够按第二个标题行排序 第一个标题行只是按日期对相关数据进行分组 如果使用此插件不可能做到这一点 也许有人有解决方法的建议 这是我的表格标
  • SQL Server 上的 varbinary 到 string

    如何将列值转换为varbinary max to varchar以人类可读的形式 以下表达式对我有用 SELECT CONVERT VARCHAR 1000 varbinary value 2 Here有关样式选择的更多详细信息 第三个参数
  • 检查是否从 iOS 设备访问 PHP 页面

    我有一个简单的 PHP 网页 并且希望返回不同的内容 具体取决于它是从 iPhone iPad 还是从网络浏览器访问 我怎样才能做到这一点 使用来自的用户代理 SERVER HTTP USER AGENT 对于简单的检测 您可以使用this
  • 如何检查网站上的值是否已更改

    基本上 如果网站上的值发生变化 我会尝试运行一些代码 Python 3 2 否则稍等一下 稍后再检查 首先 我认为我可以将值保存在变量中 并将其与下次运行脚本时获取的新值进行比较 但这很快就遇到了问题 因为当脚本再次运行并初始化该变量时 该
  • jquery ctrl+enter 作为在文本区域中输入

    I am trying to reproduce standard instant messenger behavior on TEXT area control enter works as send button ctrl enter
  • 如何在不使用更新数据库的情况下生成启用了迁移的 EF6 数据库?

    在 EF5 中 我依赖于这样一个事实 我可以使用以下命令从模型重新创建数据库Database CreateIfNotExists 我会根据需要生成迁移 但永远不会将它们签入源代码管理 因为它们往往是开发周期的工件 然后每个开发人员都会根据需