C# 每个层次结构和一对一关系的实体框架表

C# 每个层次结构和一对一关系的实体框架表,c#,entity-framework-6,one-to-one,table-per-hierarchy,C#,Entity Framework 6,One To One,Table Per Hierarchy,在EF 6 code first和SQL Server中,我很难实现每个层次结构的表以及一对一的关系。实体框架未将右列用作外键 我有一个类Version和两个继承类ProductVersion和FeatureVersion public class Version { [Key] public Int32 ID { get; private set; } public Int32 Major { get; private set; } public Int32 M

在EF 6 code first和SQL Server中,我很难实现每个层次结构的表以及一对一的关系。实体框架未将右列用作外键

我有一个类
Version
和两个继承类
ProductVersion
FeatureVersion

public class Version
{
    [Key]
    public Int32 ID { get; private set; }
    public Int32 Major { get; private set; }
    public Int32 Minor { get; private set; }
    public Int32 Patch { get; private set; }
    ..
}
这两个继承类只实现导航属性

public class ProductVersion : Version
{
    [Required]
    public virtual Product.Product Product { get; set; }
    public Int32 ProductId { get; set; }
}

public class FeatureVersion : Version
{
    [Required]
    public virtual Feature Feature { get; set; }
    public Int32 FeatureId { get; set; }
}
现在在我的产品中,我使用一对多的关系,一切都很好

public class Product
{
    public Int32 ID { get; set; }
    public String Name { get; set; }

    public List<Versioning.ProductVersion> ProductVersions { get; set; }
    ...
}
由此产生的迁移如下所示

CreateTable(
            "dbo.Versions",
            c => new
                {
                    ID = c.Int(nullable: false),
                    ...,
                    FeatureId = c.Int(),
                    ProductId = c.Int(),
                    Discriminator = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => t.ID)
            .ForeignKey("dbo.Features", t => t.ID)
            .ForeignKey("dbo.Products", t => t.ProductId, cascadeDelete: true)
            .Index(t => t.ID)
            .Index(t => t.ProductId);
正如您所看到的,功能的外键使用了错误的列

当我手动将
t=>t.ID
更改为
t=>t.FeatureId时,cascadeDelete:true
将外键正确插入数据库,但EF似乎在插入具有初始
FeatureVersion
的新功能时遇到问题;新的
FeatureVersion
FeatureId
列始终设置为0,因此导致异常(在代码中,我只需将新的
FeatureVersion
对象分配给要素对象,并尝试保存上下文更改)。 对于一对多关系的产品,一切都很好

有趣的是,当我将Feature中的引用从

公共列表产品版本{get;set;}

公共列表版本{get;set;}
e、 母亲班,一切正常;在迁移过程中,我看到右列连接在一起,INSERT也可以工作。但这肯定不是我想要的

遗传是不是有点恼人?我是否遗漏了重要的一点


我还尝试将
FeatureVersion
的关系更改为与
Product
相同的一对多关系。它工作得很好,但这不是我需要使用的关系。

看看,我认为EF处理
一对一关系的方式不能与TPH结合。好问题,我花了一天时间试图解决它,但现在倾向于另一种解决方案(如TPC)。
CreateTable(
            "dbo.Versions",
            c => new
                {
                    ID = c.Int(nullable: false),
                    ...,
                    FeatureId = c.Int(),
                    ProductId = c.Int(),
                    Discriminator = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => t.ID)
            .ForeignKey("dbo.Features", t => t.ID)
            .ForeignKey("dbo.Products", t => t.ProductId, cascadeDelete: true)
            .Index(t => t.ID)
            .Index(t => t.ProductId);