C# 每个层次结构和一对一关系的实体框架表
在EF 6 code first和SQL Server中,我很难实现每个层次结构的表以及一对一的关系。实体框架未将右列用作外键 我有一个类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
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);