2016-05-16 47 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(); 
}