为什么EF说我的模型没有改变?

时间:2017-09-25 01:06:22

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

我一直收到以下错误:

  

System.InvalidOperationException:支持'McContext'的模型   自创建数据库以来,上下文已更改。考虑使用   代码优先迁移以更新数据库   (http://go.microsoft.com/fwlink/?LinkId=238269)。

我正在使用nuget,v6.1.3中的最新实体框架创建一个.NET MVC 5网站。我附加到本地MDF文件,因为我没有在本地安装SQL Server或Express。我正在使用Code First模型。

我昨天花了几个小时,今天在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. 我开始使用“clean slate”并删除了测试数据库中的所有数据库表,并删除了所有Data \ Migrations。
  2. 重建解决方案。 (基础项目和单元测试项目)
  3. 在程序包管理器控制台中,运行“Add-Migration StartupConfig
  4. 迁移文件已添加到名为“{datetime}_StartupConfig.cs”的Data \ Migrations中。请参阅上面的StartupConfig课程。
  5. 我建立了这个项目。
  6. 我跑了“Update-Database -TargetMigration:StartupConfig
  7. PM控制台输出4行,包括“Running Seed方法”,并成功完成。
  8. 我通过SQL查询确认已将“__MigrationHistory”和“Families”表添加到数据库中,每个表都有1条记录。
  9. 我运行了单元测试并收到错误。
  10. 我有一个更复杂的模型,但我开始逐一删除东西,让事情尽可能简单。但我不能比这更简单,但错误仍然存​​在。值得注意的是,对于这个特定项目,我从未在单元测试中获得成功的查询。

    当我在上面输入这些娱乐步骤时,我正在同时执行这些步骤,并得到了同样的错误。

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

2 个答案:

答案 0 :(得分:1)

由于您的代码没有改变,因此必须使用迁移表(具有您的数据库模型信息的表)或您正在使用的数据库文件。

我建议安装Sql server express再试一次。由于您正在制作的数据库是一个文件,因此您将面临更大的风险。

编辑:

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

答案 1 :(得分:1)

在按@AaronLS建议的单元测试中检查连接字符串时,我发现连接字符串不同。

事实证明,单元测试的App.config没有连接字符串,并且将“sqlTestConnection”视为数据库名称,否则无法解析它。

将连接字符串添加到App.config解决了这个问题。