我遇到了在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);
如您所见,功能的外键使用了错误的列。
当我手动将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
相同的一对多关系。它工作正常,但这不是我需要使用的关系。