对不起,这个问题的标题不是很好。我不确定如何将主题缩减为单个句子。混合一对多与多对多的关系
这是我们开始的,非常简单的设置。组织税收是一对多的。
class DataContext : DbContext
{
public DbSet<Org> Orgs { get; set; }
public DbSet<Tax> Taxes { get; set; }
}
class Org
{
public int Id { get; set; }
private List<Tax> taxes;
public virtual List<Tax> Taxes
{
get { return taxes ?? (taxes = new List<Tax>()); }
protected set { taxes = value; }
}
}
class Tax
{
public int Id { get; set; }
public int OrgId { get; set; }
public virtual Org Org { get; set; }
}
这将产生以下的模式,符合市场预期:
现在我想一个DefaultTaxId添加[机构。
class Org
{
public int Id { get; set; }
private List<Tax> taxes;
public virtual List<Tax> Taxes
{
get { return taxes ?? (taxes = new List<Tax>()); }
protected set { taxes = value; }
}
// default tax added here
public int? DefaultTaxId { get; set; }
public virtual Tax DefaultTax { get; set; }
}
然而,当我产生迁移,C#是这样的:
public override void Up()
{
DropForeignKey("dbo.Taxes", "OrgId", "dbo.Orgs");
AddColumn("dbo.Orgs", "DefaultTaxId", c => c.Int());
AddColumn("dbo.Taxes", "Org_Id", c => c.Int());
CreateIndex("dbo.Orgs", "DefaultTaxId");
CreateIndex("dbo.Taxes", "Org_Id");
AddForeignKey("dbo.Orgs", "DefaultTaxId", "dbo.Taxes", "Id");
AddForeignKey("dbo.Taxes", "Org_Id", "dbo.Orgs", "Id");
}
和架构是这样的:
的DefaultTaxId
列被添加到[机构不出所料,但Taxes表现在有一个带有外键的Org_Id
列,并且原始OrgId
列是n o更长的外键。
为什么会发生这些额外的操作和模式更改? 我认为,因为组织有一个税和一个税有一个组织,EF认为我试图混合一对多与多对多,但我不知道如何解决它。
我该如何为Orgs添加一个DefaultTaxId外键?