【问题标题】:EF code first - Model compatibility cannot be checked because the database does not contain model metadataEF 代码优先 - 无法检查模型兼容性,因为数据库不包含模型元数据
【发布时间】:2013-03-13 21:38:14
【问题描述】:

我已启用自动迁移。然后,我删除了我的整个数据库。接下来,我从命令控制台执行Update-database,它重新创建了我的数据库。然后,我启动我的应用程序只是看到这个错误:

无法检查模型兼容性,因为数据库没有 包含模型元数据。只能检查模型兼容性 使用 Code First 或 Code First 迁移创建的数据库。

那么元数据到底是什么,我如何将实体框架指向它?

PS。我的数据库包含名为 MigrationsHistory 的表。

【问题讨论】:

    标签: entity-framework migration


    【解决方案1】:

    这是我不久前写的解决此问题的可能方法的详细说明...
    (不完全是你所经历的,因此本身不是重复的,但考虑到不同的场景)

    https://stackoverflow.com/a/10255051/417747

    总结一下……

    对我有用的是使用 Update-Database -Script

    这会创建一个具有“迁移差异”的脚本,您可以 在目标服务器数据库上手动应用为 SQL 脚本(并且您 应该插入正确的迁移表行等)。

    如果这仍然不起作用 - 你仍然可以做两件事......

    a) 删除迁移表(目标 - 在系统表下) - 根据 http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx 那里的 cmets - 这应该会恢复到以前的行为,如果 你确定你的 Db-s 是一样的——它只是“信任” 你,

    b) 作为最后的手段,我使用了 - 制作一个 Update-Database -Script 完整模式(例如,通过初始化一个空数据库,这应该强制一个 '完整脚本'),找到 INSERT INTO [__MigrationHistory] ​​记录, 只需运行这些,将它们插入数据库,并确保您的 数据库 - 和代码匹配,

    这应该会让事情再次同步运行。

    如果有帮助

    【讨论】:

    • @Kiquenet 里面没有什么,让我知道你需要什么 - 你需要删除的是 __MigrationHistory 表 - 据我记得没有其他相关内容到它(只有一个表,在系统表下)。评论是这样的,如果 EF 没有找到该表,它只会退回到“信任”您,即您的数据库架构和代码是同步的。因此,如果您知道这些是同步的,您可以随时删除该表(或者我建议在 (b) 下执行)。我在上述 (a) 项下重新表述了该评论。所以没有任何损失:)
    • 页面可以在这里找到archive 但确实 cmets 部分丢失了(有一些讨论 - 归结为我上面所说的)
    【解决方案2】:

    从Visual Studio“服务器资源管理器”中分离您的本地数据库,例如“database1.mdf”,然后打开SQL Server Management Studio,右键单击“数据库”>“附加”,然后浏览相同的“database1.mdf”文件。如果没有” t 可以访问然后将 mdf 和 ldf 文件复制并粘贴到 c 驱动器中并附加。

    然后在 sql server 上打开新的查询窗口,然后复制您的身份表,如下所示。

    *'select * into [__MigrationHistory] ​​from Database1.dbo.__MigrationHistory '*

    【讨论】:

      【解决方案3】:
      1. 包管理器控制台 > Enable-Migrations -EnableAutomaticMigrations
      2. 配置迁移/Configuration.cs
      3. 包管理器控制台 > 更新数据库

      【讨论】:

        【解决方案4】:

        将此添加到您的上下文中:

        protected override void OnModelCreating(ModelBuilder modelBuilder) 
        {
            modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
        }
        

        【讨论】:

        【解决方案5】:

        我使用实体框架 6、SQL 2008 R2、VS 2013。
        要解决此问题,请仅使用以下程序:

        1) 删除现有数据库(使用 EF 模型{code first} 创建的现有数据库)
        2)再次运行APP。

        示例查询代码(在布局中):
        如果我的模型更改并在用户表中搜索用户名,此代码将创建 db。

        <body>
            @{
                // Delete && Create ...
                Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContext>());
        
                var db = new DBContext();
                var SearchingUser = db.Users.Where(c => c.UserName == "qwertyui");
                if (SearchingUser.Count() == 0) {
                    var User = new Users { UserName = "qwertyui",Password = "12345678" };
                    db.Users.Add(User);
                    db.SaveChanges();
                }
        
            }
        
        
            @RenderSection("scripts", required: false)
            @RenderBody()
        </body>
        

        【讨论】:

        • Razor 语法到底在做什么??
        猜你喜欢
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 2013-03-13
        • 2018-02-26
        相关资源
        最近更新 更多