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

时间:2016-06-13 06:54:54

标签: c# entity-framework-6 one-to-one table-per-hierarchy

我遇到了在EF 6代码优先和SQL-Server中实现逐层结构体系结构与一对一关系的麻烦。实体框架不使用正确的列作为外键。

我有一个班级Version和两个继承班级ProductVersionFeatureVersion

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

在我的功能中,我使用一对一的关系,事情出错了。

public class Feature : ICloneable
{
    public Int32 Id { get; set; }

    ...

    public int FeatureVersionId { get; set; }
    public virtual Entities.Versioning.FeatureVersion FeatureVersion { 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&#39; FeatureId列始终设置为0,因此会导致异常(在代码中我只是将新的FeatureVersion对象分配给Feature对象并尝试保存上下文更改)。 对于具有一对多关系的产品,一切正常。

有趣的是,当我更改Feature中的引用

public List<Versioning.ProductVersion> ProductVersions { get; set; }

public List<Versioning.Version> Versions { get; set; }

e.g。母班,一切正常;在迁移中,我看到正确的列已加入,INSERT也可以正常工作。但绝对是,这不是我想要的。

继承是否会以某种方式刺激EF?我错过了一个重点吗?

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

0 个答案:

没有答案