2

我在结合 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);

如您所见,Features 的外键使用了错误的列。

当我t => t.ID手动更改t => t.FeatureId, cascadeDelete: true为外键正确插入数据库时​​,但 EF 似乎在插入带有初始的新功能时出现问题FeatureVersion;newFeatureVersionFeatureId列始终设置为 0,因此会导致异常(在代码中,我只是将一个新FeatureVersion对象分配给 Feature 对象并尝试保存上下文更改)。具有一对多关系的 Product 一切正常。

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

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

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

例如母班,一切正常;在迁移中,我看到加入了正确的列,并且 INSERT 也可以正常工作。但可以肯定的是,这不是我想要的。

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

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

4

0 回答 0