簡體   English   中英

每個層次結構的實體框架表未創建區分符

[英]Entity Framework Table per Hierarchy not creating Discriminator

經過幾次遷移后,我創建了一個繼承層次結構。 現在,當我使用代碼優先遷移來更新數據庫時,代碼優先不會自動創建鑒別字段。 從那以后,我就刪除了表並重新創建了它(使用代碼優先遷移),但沒有任何運氣。 我唯一能想到的是,派生類中沒有其他“非虛擬”屬性-創建繼承結構是為了強制執行僅某些派生類型可以與另一個實體有關系的業務規則。

基本類型:

public abstract class Process
{

    private ICollection<ProcessSpecification> _specifications { get; set; }

    protected Process()
    {
        _specifications = new List<ProcessSpecification>();
    }        

    public Int32 Id { get; set; }
    public String Description { get; set; }
    public Int32 ToolId { get; set; }

    public virtual Tool Tool { get; set; }        
    public virtual ICollection<ProcessSpecification> Specifications
    {
        get { return _specifications; }
        set { _specifications = value; }
    }

}

派生類(沒有不同/唯一的標量屬性):

public class AssemblyProcess : Process
{
    private ICollection<AssemblyProcessComponent> _components;

    public AssemblyProcess()
    {
        _components = new List<AssemblyProcessComponent>();            
    }

    public virtual ICollection<AssemblyProcessComponent> Components
    {
        get { return _components; }
        set { _components = value; }
    }
}

另一種派生類型

public class MachiningProcess : Process
{
    private ICollection<MachiningProcessFeature> _features;

    public MachiningProcess()
    {
        _features = new List<MachiningProcessFeature>();
    }

    public virtual ICollection<MachiningProcessFeature> Features { get { return _features; } set { _features = value; } }
}

代碼優先是不是沒有在數據庫中添加discriminator列,因為它沒有看到派生類之間的任何區別(因為沒有任何唯一的“非虛擬”屬性)? 如果是這樣,我該如何解決? 如果不是,為什么代碼優先將不會在數據庫中自動創建區分符列的原因有哪些? 我還有另一個TPH結構,該結構完全可以按照預期的方式工作。

DbContext:

public LineProcessPlanningContext()
        : base("LineProcessPlanning")
    {
    }   

public DbSet<Component> Components { get; set; }
public DbSet<Customer> Customers { get; set; }
public DbSet<Feature> Features { get; set; }
public DbSet<OperationDefinition> OperationDefinitions { get; set; }
public DbSet<PartDesign> PartDesigns { get; set; }
public DbSet<Process> Processes { get; set; }
public DbSet<ProcessPlan> ProcessPlans { get; set; }
public DbSet<ProcessPlanStep> ProcessPlanSteps { get; set; }
public DbSet<ProductionLine> ProductionLines { get; set; }       
public DbSet<StationCycleDefinition> StationCycleDefinitions { get; set; }
public DbSet<StationCycleStep> StationCycleSteps { get; set; }
public DbSet<StationDefinition> StationDefinitions { get; set; }
public DbSet<UnitOfMeasurement> UnitsOfMeasurement { get; set; }        
public DbSet<Tool> Tools { get; set; }

我還嘗試創建每種派生類型所獨有的“虛擬”屬性。 代碼遷移將新屬性作為列添加到表中,但是遷移未創建區分符列。

我發現了與您一樣的原因。 基類是abstract ,因此EF不會為該類創建TPH表,因為它無法實例化。 作為抽象基類的結果,EF將為每個派生類創建表,因此不需要區分符列。

就我而言,從基類中刪除abstract是可以接受的。 一旦執行此操作,EF的TPH就會按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM