我在结合 EF 6 代码优先和 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; }
...
}
在我的功能中,我使用了一对一的关系并且事情出错了。
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
;newFeatureVersion
的FeatureId
列始终设置为 0,因此会导致异常(在代码中,我只是将一个新FeatureVersion
对象分配给 Feature 对象并尝试保存上下文更改)。具有一对多关系的 Product 一切正常。
有趣的是,当我将 Feature 中的引用从
public List<Versioning.ProductVersion> ProductVersions { get; set; }
至
public List<Versioning.Version> Versions { get; set; }
例如母班,一切正常;在迁移中,我看到加入了正确的列,并且 INSERT 也可以正常工作。但可以肯定的是,这不是我想要的。
继承是否会以某种方式刺激 EF?我错过了重要的一点吗?
我还尝试将关系更改为与 forFeatureVersion
相同的一对多关系Product
。它工作正常,但这不是我需要使用的关系。