抱歉,这个问题的标题不是很好。我不知道如何将这个主题简化为一句话。
这是我们开始的,非常简单的设置。税收的组织是一对多的。
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添加到Orgs。
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
列已按预期添加到Orgs,但Taxes表现在有一个带有外键的Org_Id
列,原始OrgId
列不再是外键
为什么会发生这些额外的操作和架构更改? 我认为因为Org有税和税有组织,EF认为我试图将一对多与多对多混合,但我不知道如何解决它。
如何向Orgs添加DefaultTaxId外键?
答案 0 :(得分:0)
EF无法再确定关系。您可以使用流畅的代码来完成,或者这里需要注释:
attr
答案 1 :(得分:0)
执行此操作的Fluent配置将是:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Org>().HasMany(o => o.Taxes).WithRequired(t => t.Org);
modelBuilder.Entity<Org>().HasOptional(o => o.DefaultTax).WithRequired();
}