当首先相关 table 引用时一对一的 EF 迁移问题
EF migration issue on one-to-one when related table references first
我在 Companies 和 CompanyDemographics 之间建立了 1:1 关系,如下所示:
public class Company
{
public Company()
{
Contacts = new HashSet<Contact>();
}
[Key]
public int CompanyId { get; set; }
public string Name { get; set; }
[ForeignKey("CompanyId")]
public virtual CompanyDemographic Demographic { get; set; }
public virtual ICollection<Contact> Contacts { get; set; }
}
public class CompanyDemographic
{
[Key]
[ForeignKey("Company")]
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
public int EmployeeCount { get; set; }
}
迁移构建正确,一切正常。
然后我将 CompanyDemographic 的引用添加回 Company,如下所示:
public class CompanyDemographic
{
[Key]
[ForeignKey("Company")]
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
public int EmployeeCount { get; set; }
// ADDING THIS
[ForeignKey("CurrentProvider")]
public int CurrentProviderCompanyId { get; set; }
public virtual Company CurrentProvider { get; set; }
}
当我去添加迁移时,它看起来像这样:
public override void Up()
{
DropForeignKey("dbo.Contacts", "CompanyId", "dbo.Companies");
DropForeignKey("dbo.CompanyDemographics", "CompanyId", "dbo.Companies");
DropPrimaryKey("dbo.Companies");
AddColumn("dbo.CompanyDemographics", "CurrentProviderCompanyId", c => c.Int(nullable: false));
AlterColumn("dbo.Companies", "CompanyId", c => c.Int(nullable: false));
AddPrimaryKey("dbo.Companies", "CompanyId");
CreateIndex("dbo.Companies", "CompanyId");
CreateIndex("dbo.CompanyDemographics", "CurrentProviderCompanyId");
AddForeignKey("dbo.CompanyDemographics", "CurrentProviderCompanyId", "dbo.Companies", "CompanyId", cascadeDelete: true);
AddForeignKey("dbo.Contacts", "CompanyId", "dbo.Companies", "CompanyId", cascadeDelete: true);
AddForeignKey("dbo.CompanyDemographics", "CompanyId", "dbo.Companies", "CompanyId");
}
它正在尝试删除所有密钥并重建。我该如何避免这种情况?
将@Steve Greene 评论转换为答案:
将 [InverseAttribute("Company")] 放在公司的人口统计 属性 上(而不是外键)解决了这个问题!
[InverseAttribute("Company")]
public virtual CompanyDemographic Demographic { get; set; }
我在 Companies 和 CompanyDemographics 之间建立了 1:1 关系,如下所示:
public class Company
{
public Company()
{
Contacts = new HashSet<Contact>();
}
[Key]
public int CompanyId { get; set; }
public string Name { get; set; }
[ForeignKey("CompanyId")]
public virtual CompanyDemographic Demographic { get; set; }
public virtual ICollection<Contact> Contacts { get; set; }
}
public class CompanyDemographic
{
[Key]
[ForeignKey("Company")]
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
public int EmployeeCount { get; set; }
}
迁移构建正确,一切正常。
然后我将 CompanyDemographic 的引用添加回 Company,如下所示:
public class CompanyDemographic
{
[Key]
[ForeignKey("Company")]
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
public int EmployeeCount { get; set; }
// ADDING THIS
[ForeignKey("CurrentProvider")]
public int CurrentProviderCompanyId { get; set; }
public virtual Company CurrentProvider { get; set; }
}
当我去添加迁移时,它看起来像这样:
public override void Up()
{
DropForeignKey("dbo.Contacts", "CompanyId", "dbo.Companies");
DropForeignKey("dbo.CompanyDemographics", "CompanyId", "dbo.Companies");
DropPrimaryKey("dbo.Companies");
AddColumn("dbo.CompanyDemographics", "CurrentProviderCompanyId", c => c.Int(nullable: false));
AlterColumn("dbo.Companies", "CompanyId", c => c.Int(nullable: false));
AddPrimaryKey("dbo.Companies", "CompanyId");
CreateIndex("dbo.Companies", "CompanyId");
CreateIndex("dbo.CompanyDemographics", "CurrentProviderCompanyId");
AddForeignKey("dbo.CompanyDemographics", "CurrentProviderCompanyId", "dbo.Companies", "CompanyId", cascadeDelete: true);
AddForeignKey("dbo.Contacts", "CompanyId", "dbo.Companies", "CompanyId", cascadeDelete: true);
AddForeignKey("dbo.CompanyDemographics", "CompanyId", "dbo.Companies", "CompanyId");
}
它正在尝试删除所有密钥并重建。我该如何避免这种情况?
将@Steve Greene 评论转换为答案:
将 [InverseAttribute("Company")] 放在公司的人口统计 属性 上(而不是外键)解决了这个问题!
[InverseAttribute("Company")]
public virtual CompanyDemographic Demographic { get; set; }