每个层次结构的实体框架表不会创建判别器

我在几次迁移后创建了一个继承层次结构。 现在,当我使用代码优先迁移更新数据库时,代码优先不会自动创建鉴别器字段。 之后,我没有任何运气,放弃了表格并重新创建了它(使用代码优先迁移)。 我唯一能想到的是派生类中没有额外的“非虚拟”属性 - 创建继承结构是为了强制执行只有某个派生类型可以与另一个实体有关系的业务规则。

基本类型:

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

代码优先不在数据库中添加鉴别器列,因为它没有看到派生类之间的任何差异(因为没有任何独特的“非虚拟”属性)? 如果是这样,我该如何解决这个问题? 如果没有,为什么代码优先不会自动在数据库中创建鉴别器列的原因是什么? 我有另一个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按预期工作。

链接地址: http://www.djcxy.com/p/83241.html

上一篇: Entity Framework Table per Hierarchy not creating Discriminator

下一篇: How to create Discriminator column in Database First