实现接口导致TPT从继承类导致TPH

Kir*_*eed 6 ef-code-first entity-framework-6

我想创建一个自引用文件夹表和相关的文件表

如MyFolder1和MyFile1所示.

在此输入图像描述

我了解如何通过继承接口来获得此结构.

是否也可以通过继承抽象类来实现?

public class Model1Context : DbContext
{
    public Model1Context()
        : base("name=Model1")
    {
        Database.SetInitializer(new Model1Initializer());
    }

    public virtual DbSet<MyFolder1> MyFolder1s { get; set; }
    public virtual DbSet<MyFile1> MyFile1s { get; set; }
    public virtual DbSet<MyFolder2> MyFolder2s { get; set; }
    public virtual DbSet<MyFile2> MyFile2s { get; set; }
}

public class Model1Initializer : DropCreateDatabaseIfModelChanges<Model1Context>
{
}

public class MyFolder1 : BasicBO, ISequencedTreeNode
{
    public MyFolder1 MyFolder { get; set; }
    public int SeqNo { get; set; }
    [NotMapped]
    public ISequencedTreeNode Parent
    {
        get
        {
            return MyFolder;
        }
        set
        {
            MyFolder = (MyFolder1)value;
        }
    }
}

public class MyFile1 : BasicBO, ISequencedTreeNode
{
    public MyFolder1 MyFolder { get; set; }
    public int SeqNo { get; set; }
    [NotMapped]
    public ISequencedTreeNode Parent
    {
        get
        {
            return MyFolder;
        }
        set
        {
            MyFolder = (MyFolder1)value;
        }
    }
}

public interface ISequencedTreeNode
{
    [Required]
    int SeqNo { get; set; }
    ISequencedTreeNode Parent { get; set; }
}

public abstract class SequencedTreeNode : BasicBO
{
    [Required]
    public  int SeqNo { get; set; }
    public  SequencedTreeNode Parent { get; set; }
}

//  [Table("MyFolder2")]
public class MyFolder2 : SequencedTreeNode
{

}

//  [Table("MyFile2")]
public class MyFile2 : SequencedTreeNode
{

}

public class BasicBO
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

将BasicBO标记为抽象似乎不会影响表构造.

[更新]我可以通过向MyFile2和MyFolder2添加[Table('tablename')]属性来强制TPT,但是这些表将只有一个Id字段,而SequencedTreeNodes表仍然会创建.

对我来说,一个接口在强制TPT方面可能更有效是有道理的,因为总是需要为接口实现属性.但是,如果我在SequencedTreeNode摘要中创建所有属性,我会认为会发生同样的事情.但是,如果我这样做,我得到一个运行时错误'属性'SeqNo'不是'MyFile2'类型的声明属性