Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t想出解决';支持';TasksJobsDbContext';自创建数据库以来,上下文已更改';_C#_Entity Framework_Ef Code First_Code First_Entity Framework Migrations - Fatal编程技术网

C# Can';t想出解决';支持';TasksJobsDbContext';自创建数据库以来,上下文已更改';

C# Can';t想出解决';支持';TasksJobsDbContext';自创建数据库以来,上下文已更改';,c#,entity-framework,ef-code-first,code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Code First,Entity Framework Migrations,我已经试着解决这个问题三天了,但就是想不出来。我在网上搜索了很多次,大多数解决方案都建议使用空初始值设定项,但这并不能解决我的问题: 这是我的模型: public class JobsRecord { [Key] public int Index { get; set; } [Required] [Index] public int TaskID { get; set; } [ForeignKey("TaskID")] public

我已经试着解决这个问题三天了,但就是想不出来。我在网上搜索了很多次,大多数解决方案都建议使用空初始值设定项,但这并不能解决我的问题:

这是我的模型:

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类中。到目前为止,我一直在使用EF Code First migrations,对此非常满意,但现在,当我尝试将EnableDisable字段添加到该类中并运行“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();
            }
我知道我可以像在其他stackoverflow线程中读到的那样“重新启动”迁移,方法是删除迁移表和目录,从头开始,让数据库和迁移重新创建,但显然我不想丢失数据,更重要的是,我想弄清楚它,以便将来能够处理它

我尝试了空初始值设定项,但没有效果

每次出现此错误时,我都会通过“更新数据库-TargetMigration:“我的上一次工作迁移”恢复上次迁移,这就解决了问题

我尝试了一些调试以添加更多数据:

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);}
我得到的是(初始化器set do Database.SetInitializer(null); 或者到Database.SetInitializer(new CreateDatabaseIfNotExists());,两者的结果相同) :false,false,true,然后再次出现此异常


我使用的是VS2013、EF 6.9.6.0、代码优先、MySQL,这是我使用EF的第一个项目(到目前为止进展得相当顺利)。

因此,正如我们在评论中发现的那样,除了错误本身,一切似乎都正常。。 我猜不出它的实际原因,但我有一些建议来减轻后果

  • 为您拥有的所有数据生成脚本(例如,SQL management studio有这种可能性),删除您的数据库,运行所有迁移以创建数据库,恢复数据,这样的工作从未发生过(事实上,我以前从未遇到过这种奇怪的行为,因此很可能不会重复)
  • 删除您的
    MigrationHistory
    表和所有迁移(代码和资源),然后使用
    addmigration
    命令的
    -IgnoreChanges
    标志从实际数据库状态开始创建迁移
如为
-IgnoreChanges
编写的文档所述

构建空迁移,忽略在当前模型中检测到的任何挂起的更改。这可用于创建 初始空迁移,以启用现有数据库的迁移 数据库注意:这样做假定目标数据库架构是 与当前型号兼容


但是,使用这种方法,您将无法仅使用迁移在另一台服务器上重新创建数据库。

因此,在使用上下文之前,您是否检查了数据库是否正确表示您的POCO类?@Ruskin很好,是的,我检查了。检查了数据库并检查了每一列,检查了最后一列是否按预期添加,我没有发现我的类和数据库之间有任何不匹配。请再次运行
Add migration
并检查它是否为空。您能给我看一下数据库初始值设定项逻辑的代码吗?另外,它是在您对代码优先实体的每次更改之后发生的,还是仅在一个新属性之后发生的?@Vladislav,是吗,关于第二个建议,它是空的(向上和向下函数):a。不会丢失任何数据,对吗?只是为了确定b。如果在投入生产时,我将生成一个SQL脚本来构建我的新数据库,该怎么办?我是否仍能在新数据库中继续使用EF CF migrations?a)您将删除
MigrationHistory
表并创建一个空迁移,因此不可能丢失任何数据(尽管如此,还是要进行备份)。b) 您将无法仅通过运行迁移来重新创建数据库,您当前的数据库状态将被迁移忽略,只会跟踪进一步的更改(我忘了提到,您还应该删除所有当前迁移(类和资源)。但是,您将能够使用ManagementStudio或任何其他工具重新创建数据库,这些工具将生成数据库创建脚本。迁移也可以在新的数据库上运行。谢谢@Vladislav,您的建议解决了我的问题:只需使用-ignorechanges标志重新创建迁移(在删除以前的迁移和迁移表之后),同时希望这种情况不会再次发生:)