2016-05-16 95 views
0

據我所知,Table Per Hierarchy是第一個在asp.net mvc代碼中的默認值(?)。然而,當我創建一個抽象基類和兩個空子類時,遷移想要創建兩個單獨的表,而不是一個具有鑑別器列的表。ASP.NET MVC代碼第一個TPH不工作,爲每個子類創建一個表,爲什麼?

public abstract class ShippingBase : Entity 
{ 
    public ShippingBase() 
    { } 

    public bool IsDefault { get; set; } 
} 

public class Shipping : ShippingBase 
{ 
    public Shipping():base() 
    { } 
} 

public class FlatRateShipping : ShippingBase 
{ 
    public FlatRateShipping():base() 
    { } 
} 

我添加了兩個子類的分貝背景:

public virtual IDbSet<Localization.Shipping> Shippings { get; set; } 
public virtual IDbSet<Localization.FlatRateShipping> FlatRateShippings { get; set; } 

而且我也不做任何OnModelCreating。

我正在使用ASP.NET Boilerplate,但據我所知它不會更改任何會給出此結果的設置。我知道如何強制TPC,但由於TPH是默認設置,我沒有找到任何設置它的方法。 有什麼辦法可以強制TPH呢?還是我錯過了我的課程?

這是導致遷移:

public override void Up() 
    { 
     CreateTable(
      "dbo.FlatRateShippings", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        IsDefault = c.Boolean(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateTable(
      "dbo.Shippings", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        IsDefault = c.Boolean(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

    } 

回答

1

這是因爲他們從一個抽象類繼承。抽象類沒有資格映射到表,因爲它們永遠不會被自己實例化。你可以在繼承鏈中有一個抽象類,但是隻有從它派生出來的第一個具體類會得到一個表。例如,如果您從Shipping繼承FlatRateShipping,則兩者的數據將以dbo.Shippings(默認複數形式)結尾。

如果它沒有意義有FlatRateShipping繼承Shipping(因爲他們是邏輯上的兄弟姐妹,而不是父子),則確實Shipping太普通了一個名字。將它重命名爲更具描述性的內容,然後使Shipping只是一個ShippingBase的具體實現,它們都可以繼承。

如果這些都不符合您的喜好,您可以簡單地讓ShippingBase不抽象,並獲得相同的結果(儘管您的表默認爲dbo.ShippingBases)。

+0

我現在嘗試使ShippingBase具體,但結果仍然相同。還有其他建議嗎?關於命名,Shipping將代表具有所有屬性的許多不同的運輸方法,而需要額外/不同的運輸方法獲得他們自己的類。 –

+0

現在我明白了。我還必須將ShippingBases添加到數據庫上下文才能使用。謝謝克里斯! :) –

相關問題