gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:08:37 24 4
gpt4 key购买 nike

我不断收到以下错误:

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 的最新 Entity Framework 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. 我从“清白”开始,删除了测试数据库中的所有数据库表,并删除了所有 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 method”,成功完成。
  8. 我通过 SQL 查询确认“__MigrationHistory”和“Families”表已添加到数据库中,并且每个表有 1 条记录。
  9. 我运行了单元测试并收到错误。

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

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

我不知道接下来要尝试什么?

最佳答案

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

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

编辑:

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com