c# - 为什么 EF 说我的模型已更改,而实际上它没有更改?

标签 c# sql-server asp.net-mvc entity-framework-6 asp.net-mvc-5.2

我不断收到以下错误:

System.InvalidOperationException: The model backing the 'McContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

我正在使用 nuget v6.1.3 的最新 Entity Framework 创建一个 .NET MVC 5 网站。我附加到本地 MDF 文件,因为我本地没有安装 SQL Server 或 Express。我正在使用代码优先模型。

我昨天和今天花了几个小时梳理有关此错误的 SO 和 WWW 帖子,但还没有找到有效的解决方案。其中大多数都围绕不同类型的初始值设定项,或有关代码如何首先需要迁移或初始值设定项以进行模型更改的简短说明。但我通过 PM 控制台手动运行设置。我已在下面列出了我的步骤。

连接字符串:

<add name="testSQLConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\jwatts\Documents\Visual Studio 2015\Projects\MyProject\Databases\MyProject01.mdf;Integrated Security=True;Connect Timeout=30" providerName="System.Data.SqlClient" />

型号:

public class Family
{
    public Family() { }

    [Key, Index(IsUnique = true)]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [StringLength(128)]
    public string Name { get; set; }

    [StringLength(1024)]
    public string Description { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime? Changed { get; set; }

    public string ChangedBy { get; set; }

    public DateTime? Deleted { get; set; }

    public string DeletedBy { get; set; }
}

背景:

public class McContext : DbContext
{
    public McContext() : base("testSQLConnection") { }

    public DbSet<Family> Families { get; set; }
}

配置:

internal sealed class Configuration : DbMigrationsConfiguration<Data.McContext>
{
    public Configuration()
    {
        MigrationsDirectory = @"Data\Migrations";
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(McContext context)
    {
        context.Families.Add(new Family()
        {
            Name = "My Family",
            Description = "The family",
            Created = DateTime.Now,
            CreatedBy = "system"
        });
        context.SaveChanges();
    }
}

自动生成的迁移类:

public partial class StartupConfig : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Families",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(nullable: false, maxLength: 128),
                    Description = c.String(maxLength: 1024),
                    Created = c.DateTime(nullable: false),
                    CreatedBy = c.String(),
                    Changed = c.DateTime(),
                    ChangedBy = c.String(),
                    Deleted = c.DateTime(),
                    DeletedBy = c.String(),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.Id, unique: true);

    }

    public override void Down()
    {
        DropIndex("dbo.Families", new[] { "Id" });
        DropTable("dbo.Families");
    }
}

单元测试代码:

[TestMethod]
public void CreateTheContext_Test()
{
    using (var ctx = new McContext())
    {
        //error on this line below:
        var fam = ctx.Families.Where(f => f.Name.Contains("My")).FirstOrDefault();
        Assert.IsTrue(fam != null && fam.Name.Contains("My"));
    }   
}

娱乐步骤:

  1. 我从头开始,删除了测试数据库中的所有数据库表,并删除了所有 Data\Migrations。
  2. 重建解决方案。 (基础项目和单元测试项目)
  3. 在程序包管理器控制台中,运行“Add-Migration StartupConfig
  4. 名为“{datetime}_StartupConfig.cs”的迁移文件将添加到 Data\Migrations 中。请参阅上面的 StartupConfig 类。
  5. 我构建了该项目。
  6. 我运行了“Update-Database -TargetMigration:StartupConfig
  7. PM 控制台输出 4 行,包括“运行种子方法”,并成功完成。
  8. 我通过 SQL 查询确认“__MigrationHistory”和“Families”表已添加到数据库中,并且每个表都有 1 条记录。
  9. 我运行了单元测试并收到错误。

我有一个更复杂的模型,但我开始一一删除一些东西,使事情尽可能简单。但我无法得到比这更简单的结果,但错误仍然存​​在。值得注意的是,对于这个特定的项目,我从未从单元测试中获得成功的查询。

当我输入上面的这些重新创建步骤时,我同时执行这些步骤,并得到了相同的错误。

我不知道下一步该尝试什么?

最佳答案

由于您的代码没有改变,所以它必须与迁移表(包含数据库模型信息的表)或您正在使用的数据库文件相关。

我会建议安装 Sql server express 并重试一切。由于您正在创建的数据库是一个文件,因此您将面临更大的风险。

编辑:

尝试查看您的项目正在使用的实例的名称。默认情况下 EF 使用 DefaultConnection。检查所有项目中的 web.config 或配置文件。

关于c# - 为什么 EF 说我的模型已更改,而实际上它没有更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396305/

相关文章:

c# - 试图理解 GetHashCode()

c# - 使用字典键和值填充 DataGridViewComboBoxColumn

sql-server - SSMS T-SQL 设置重复行号的列

sql - Entity Framework 6 - 保存更改

c# - 法语口音在 asp.net MVC View 中未正确显示

asp.net-mvc - ASP.NET MVC 3 (Razor) Ajax.ActionLink - 我做错了什么?

c# - Json.NET - 自定义转换器 - 字符串到 Int

c# - 检查方法是否通过反射实现 IDisposable.Dispose

sql-server - SQL Server - 检查具有特定值的记录是否存在

sql-server - 如何使用 T-SQL 暂时禁用外键约束?