无法找到“支持 'TasksJobsDbContext' 上下文的模型自创建数据库以来已更改”的解决方案
Can't figure out a solution to 'The model backing the 'TasksJobsDbContext' context has changed since the database was created'
我已经尝试解决这个问题 3 天了,就是想不通。我在网上搜索了很多,大多数解决方案都建议使用 null 初始化程序,但这并不能解决我的问题:
这是我的模型:
public class JobsRecord
{
[Key]
public int Index { get; set; }
[Required]
[Index]
public int TaskID { get; set; }
[ForeignKey("TaskID")]
public virtual TasksRecord Task { get; set; }
[Required]
[Index]
public Int64 DeviceID { get; set; }
[Required]
public DateTime NextRunTimestamp { get; set; }
public DateTime TimeOfRun { get; set; }
public TasksJobsMisc.RunResultEnum RunResult { get; set; }
public int JobResult { get; set; }
public double JobResultValue { get; set; }
public string ExtendedResults { get; set; }
public string Comments { get; set; }
}
public class JobsRecordHistory
{
[Key]
public int Index { get; set; }
[Required]
[Index]
public int TaskID { get; set; }
[ForeignKey("TaskID")]
public virtual TasksRecord Task { get; set; }
[Index]
public Int64 DeviceID { get; set; }
public TasksJobsMisc.RunResultEnum RunResult { get; set; }
public int JobResult { get; set; }
public double JobResultValue { get; set; }
public string ExtendedResults { get; set; }
public string Comments { get; set; }
}
public class TasksRecord
{
[Key]
public int TaskID { get; set; }
[Required]
public int Interval { get; set; } //minutes
[Required]
public string TaskObjName { get; set; }
[Required]
[Index]
public ReporterType Type { get; set; }
public int MaxDaysSinceLastReport { get; set; }
public int MinVersion { get; set; }
public int MaxVersion { get; set; }
public int FailureInterval { get; set; } //minutes
public string Site { get; set; }
public string TaskName { get; set; }
public string JSONConfig { get; set; } //extra configuration
public int ParallelLevel { get; set; } //control parallelism for each task
public int EnableDisable { get; set; }
}``
我想做的是将最后一个字段 EnableDisable 添加到 TaskRecord class。到目前为止,我一直在使用 EF Code First 迁移并对此感到非常高兴,但是现在,当我尝试将 EnableDisable 字段添加到 class 和 运行 'Add-Migration TasksEnable' 然后更新时-数据库,虽然它 运行 成功,但当我 运行 我的代码时,我得到“支持 'TasksJobsDbContext' 上下文的模型自创建数据库以来已更改”错误,我将我的上下文用于第一次:
using (var db = new TasksJobsDbContext())
{
var blankjobs = db.JobsRecords.Include("Task").Where(x => x.RunResult == TasksJobsMisc.RunResultEnum.Blank);
Log.DebugFormat("Found {0} jobs", blankjobs.Count());
jobs = blankjobs.Where(x => DateTime.Now.CompareTo(x.NextRunTimestamp) > 0).ToList();
}
我知道我可以 'restart' 迁移,就像我在其他一些 Whosebug 线程中读到的那样,通过删除迁移 table 和目录,然后从头开始,让数据库和迁移重新创建,但显然我不想丢失我的数据,更重要的是,我想弄清楚,以便将来处理。
我尝试了 null 初始值设定项,但没有帮助。
每次出现此错误时,我只是通过“Update-Database -TargetMigration: 'my last working migration'”还原上次迁移,这就解决了问题。
我尝试了一些调试以添加更多数据:
using (var db = new TasksJobsDbContext())
{
Log.DebugFormat("compatible (with metadata): {0}", db.Database.CompatibleWithModel(true));
Log.DebugFormat("compatible: {0}", db.Database.CompatibleWithModel(false));
Log.DebugFormat("exists: {0}", db.Database.Exists());
db.Database.Initialize(true);}
我得到的是 (initializer set do Database.SetInitializer(null);
或 Database.SetInitializer(new CreateDatabaseIfNotExists());,两者结果相同)
: false, false, true, 然后又是这个异常...
我正在使用 VS2013、EF 6.9.6.0、Code First,MySQL,这是我使用 EF 的第一个项目(到目前为止进展顺利)。
因此,正如我们在评论中发现的那样,一切似乎都正常,除了错误本身......
我猜不出真正的原因,但有一些建议可以减轻结果。
- 为您拥有的所有数据生成脚本(例如,SQL management studio 有这种可能性),删除您的数据库,运行 用于创建数据库的所有迁移,恢复数据和类似的工作这从来没有发生过(实际上我以前从未遇到过这种奇怪的行为,所以很可能不会重复)
- 删除您的
MigrationHistory
table 和所有迁移(代码和资源),然后使用 add-migration
的 -IgnoreChanges
标志从实际数据库状态开始创建迁移命令。
如 -IgnoreChanges
的文档中所述。
Scaffolds an empty migration ignoring any pending changes detected in the current model. This can be used to create an
initial, empty migration to enable Migrations for an existing
database. N.B. Doing this assumes that the target database schema is
compatible with the current model.
但是使用这种方法,您将无法仅使用迁移在另一台服务器上重新创建数据库。
我已经尝试解决这个问题 3 天了,就是想不通。我在网上搜索了很多,大多数解决方案都建议使用 null 初始化程序,但这并不能解决我的问题:
这是我的模型:
public class JobsRecord
{
[Key]
public int Index { get; set; }
[Required]
[Index]
public int TaskID { get; set; }
[ForeignKey("TaskID")]
public virtual TasksRecord Task { get; set; }
[Required]
[Index]
public Int64 DeviceID { get; set; }
[Required]
public DateTime NextRunTimestamp { get; set; }
public DateTime TimeOfRun { get; set; }
public TasksJobsMisc.RunResultEnum RunResult { get; set; }
public int JobResult { get; set; }
public double JobResultValue { get; set; }
public string ExtendedResults { get; set; }
public string Comments { get; set; }
}
public class JobsRecordHistory
{
[Key]
public int Index { get; set; }
[Required]
[Index]
public int TaskID { get; set; }
[ForeignKey("TaskID")]
public virtual TasksRecord Task { get; set; }
[Index]
public Int64 DeviceID { get; set; }
public TasksJobsMisc.RunResultEnum RunResult { get; set; }
public int JobResult { get; set; }
public double JobResultValue { get; set; }
public string ExtendedResults { get; set; }
public string Comments { get; set; }
}
public class TasksRecord
{
[Key]
public int TaskID { get; set; }
[Required]
public int Interval { get; set; } //minutes
[Required]
public string TaskObjName { get; set; }
[Required]
[Index]
public ReporterType Type { get; set; }
public int MaxDaysSinceLastReport { get; set; }
public int MinVersion { get; set; }
public int MaxVersion { get; set; }
public int FailureInterval { get; set; } //minutes
public string Site { get; set; }
public string TaskName { get; set; }
public string JSONConfig { get; set; } //extra configuration
public int ParallelLevel { get; set; } //control parallelism for each task
public int EnableDisable { get; set; }
}``
我想做的是将最后一个字段 EnableDisable 添加到 TaskRecord class。到目前为止,我一直在使用 EF Code First 迁移并对此感到非常高兴,但是现在,当我尝试将 EnableDisable 字段添加到 class 和 运行 'Add-Migration TasksEnable' 然后更新时-数据库,虽然它 运行 成功,但当我 运行 我的代码时,我得到“支持 'TasksJobsDbContext' 上下文的模型自创建数据库以来已更改”错误,我将我的上下文用于第一次:
using (var db = new TasksJobsDbContext())
{
var blankjobs = db.JobsRecords.Include("Task").Where(x => x.RunResult == TasksJobsMisc.RunResultEnum.Blank);
Log.DebugFormat("Found {0} jobs", blankjobs.Count());
jobs = blankjobs.Where(x => DateTime.Now.CompareTo(x.NextRunTimestamp) > 0).ToList();
}
我知道我可以 'restart' 迁移,就像我在其他一些 Whosebug 线程中读到的那样,通过删除迁移 table 和目录,然后从头开始,让数据库和迁移重新创建,但显然我不想丢失我的数据,更重要的是,我想弄清楚,以便将来处理。
我尝试了 null 初始值设定项,但没有帮助。
每次出现此错误时,我只是通过“Update-Database -TargetMigration: 'my last working migration'”还原上次迁移,这就解决了问题。
我尝试了一些调试以添加更多数据:
using (var db = new TasksJobsDbContext())
{
Log.DebugFormat("compatible (with metadata): {0}", db.Database.CompatibleWithModel(true));
Log.DebugFormat("compatible: {0}", db.Database.CompatibleWithModel(false));
Log.DebugFormat("exists: {0}", db.Database.Exists());
db.Database.Initialize(true);}
我得到的是 (initializer set do Database.SetInitializer(null); 或 Database.SetInitializer(new CreateDatabaseIfNotExists());,两者结果相同) : false, false, true, 然后又是这个异常...
我正在使用 VS2013、EF 6.9.6.0、Code First,MySQL,这是我使用 EF 的第一个项目(到目前为止进展顺利)。
因此,正如我们在评论中发现的那样,一切似乎都正常,除了错误本身...... 我猜不出真正的原因,但有一些建议可以减轻结果。
- 为您拥有的所有数据生成脚本(例如,SQL management studio 有这种可能性),删除您的数据库,运行 用于创建数据库的所有迁移,恢复数据和类似的工作这从来没有发生过(实际上我以前从未遇到过这种奇怪的行为,所以很可能不会重复)
- 删除您的
MigrationHistory
table 和所有迁移(代码和资源),然后使用add-migration
的-IgnoreChanges
标志从实际数据库状态开始创建迁移命令。
如 -IgnoreChanges
的文档中所述。
Scaffolds an empty migration ignoring any pending changes detected in the current model. This can be used to create an initial, empty migration to enable Migrations for an existing database. N.B. Doing this assumes that the target database schema is compatible with the current model.
但是使用这种方法,您将无法仅使用迁移在另一台服务器上重新创建数据库。