我在将一对一关系更改为一对多关系时遇到了一些极端困难,而无需完全清除数据库并重新开始(我无法合理地对生产数据库执行此操作)。启用自动迁移的实体框架 6(也无法更改此设置)。
原始数据库模式要求这些类之间存在一对一的关系(不相关的属性已被删除):
public class Job
{
[Key]
public int JobIb { get; set; }
public virtual JobSite Location { get; set; }
}
public class JobSite
{
[Key]
[ForeignKey("Job")]
public int JobSiteID { get; set; }
[Required]
public virtual Job Job { get; set; }
}
随后,需求更改为一对多(一个 JobSite 可以有多个 Job)
public class Job
{
[Key]
public int JobIb { get; set; }
public virtual JobSite Location { get; set; }
}
public class JobSite
{
[Key]
public int JobSiteID { get; set; }
public virtual ICollection<Job> Jobs { get; set; }
}
这与EntityFrameworkTutorial上的约定 #3和Microsoft 的导航属性示例相匹配。
第一种方法进一步向下移动以进行归档。长话短说,您不能将现有列设为标识列
我的下一个方法是在一次迁移中完全删除 JobSites 表以及与 Job 表的关系,然后在第二次迁移中重新建立它们:
这里的重点是为什么后续更新不会触发EF认为模型与数据库一致......
步骤1
public override void Up()
{
DropForeignKey("dbo.JobSites", "JobSiteID", "dbo.Jobs");
DropIndex("dbo.JobSites", new[] { "JobSiteID" });
DropTable("dbo.JobSites");
}
public override void Down()
{
CreateTable(
"dbo.JobSites",
c => new
{
JobSiteID = c.Int(nullable: false),
})
.PrimaryKey(t => t.JobSiteID);
CreateIndex("dbo.JobSites", "JobSiteID");
AddForeignKey("dbo.JobSites", "JobSiteID", "dbo.Jobs", "JobIb");
}
最初这是有效的。但是,如果我删除本地数据库,并提取生产数据库的新副本,并运行步骤 1 和步骤 2 迁移的更新数据库,则会收到 System.InvalidOperationException 错误:“自创建数据库以来,支持“ApplicationDbContext”上下文的模型已更改。
所以这非常令人沮丧。如果我添加迁移临时,以查看它认为模型中发生了什么变化,我会得到与最初所做的完全相同的脚手架,就像它没有注册第 1 步和第 2 步迁移一样。
繁星淼淼
相关分类