Entity Framework Table per Hierarchy not creating Discriminator

I created an inheritance hierarchy after a few migrations. Now when I update the database using code first migrations, code-first is not automatically creating the discriminator field. I have since dropped the table and recreated it (using code-first migrations) without any luck. The only thing I can think of is that there are no additional "non-virtual" properties in the derived classes--the inheritance structure was created to enforce a business rule that only a certain derived type can have a relationship with another entity.

Base Type:

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

}

Derived class (no different/unique scalar properties):

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

Another derived type

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

Is code-first not adding the discriminator column in the database because it doesn't see any differences between the derived classes (because of there not being any unique "non-virtual" properties)? If so, how do I get around this? If not, what are some reasons why code-first would not automatically create the discriminator column in the database? I have another TPH structure that works exactly the way it's supposed to.

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

I also tried creating "dummy" properties that are unique to each derived type. Code migrations added the new properties as columns to the table, but the migration did not create a discriminator column.


I figured out the cause of this in my situation, same as yours. The base class is abstract , therefore EF won't create a TPH table for that class since it can't be instantiated. As a result of the abstract base class, EF will create tables for each of the derived classes, and therefore no need for a discriminator column.

In my case, it was acceptable to remove abstract from the base class. Once I did this, EF's TPH worked as expected.

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

上一篇: Java Point,getX()和point.x之间的区别

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