2016-05-16 66 views
2

对不起,这个问题的标题不是很好。我不确定如何将主题缩减为单个句子。混合一对多与多对多的关系

这是我们开始的,非常简单的设置。组织税收是一对多的。

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; } 
} 

这将产生以下的模式,符合市场预期:

Before

现在我想一个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"); 
} 

和架构是这样的:

After

DefaultTaxId列被添加到[机构不出所料,但Taxes表现在有一个带有外键的Org_Id列,并且原始OrgId列是n o更长的外键。

为什么会发生这些额外的操作和模式更改? 我认为,因为组织有一个税和一个税有一个组织,EF认为我试图混合一对多与多对多,但我不知道如何解决它。

我该如何为Orgs添加一个DefaultTaxId外键?

回答

0

流利的配置要做到这一点是:

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(); 
}