我在几次迁移后创建了一个继承层次结构。现在,当我使用代码优先迁移更新数据库时,代码优先不会自动创建鉴别器字段。从那以后,我放弃了表格并重新创建了它(使用代码优先迁移)但没有任何运气。我唯一能想到的是派生类中没有额外的“非虚拟”属性——创建继承结构是为了强制执行只有特定派生类型才能与另一个实体建立关系的业务规则。
基本类型:
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 结构,它完全按照预期的方式工作。
数据库上下文:
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; }
我还尝试创建每个派生类型所特有的“虚拟”属性。代码迁移将新属性作为列添加到表中,但迁移没有创建鉴别器列。
我和你的情况一样,找出了造成这种情况的原因。基类是抽象
,因此 EF 不会为该类创建 TPH 表,因为它无法实例化。作为抽象基类的结果,EF 将为每个派生类创建表,因此不需要鉴别器列。
在我的例子中,从基类中删除 abstract
是可以接受的。执行此操作后,EF 的 TPH 将按预期工作。
我是一名优秀的程序员,十分优秀!