C# 存在'时的外键约束;将导航属性设置为派生类

C# 存在'时的外键约束;将导航属性设置为派生类,c#,entity-framework,inheritance,C#,Entity Framework,Inheritance,我首先使用代码在Entity Framework中创建数据库,并使用每个层次表的方法为下面所示的类创建继承层次结构 运行迁移时,一切正常,但更新数据库时,出现以下错误: System.Data.SqlClient.SqlException:INSERT语句与外键约束“FK_dbo.BaseStatus_dbo.Rider_ID”冲突。冲突发生在数据库“ASPNET_INSURANCE_c48b7267b7cd4bac952caa1a467ab9ae”表“dbo.Rider”列“ID”中 我有一个

我首先使用代码在Entity Framework中创建数据库,并使用每个层次表的方法为下面所示的类创建继承层次结构

运行迁移时,一切正常,但更新数据库时,出现以下错误:

System.Data.SqlClient.SqlException:INSERT语句与外键约束“FK_dbo.BaseStatus_dbo.Rider_ID”冲突。冲突发生在数据库“ASPNET_INSURANCE_c48b7267b7cd4bac952caa1a467ab9ae”表“dbo.Rider”列“ID”中

我有一个类,它具有派生类的导航属性。(简化代码)

公共类附加条款
{
公共int ID{get;set;}
公共虚拟DerivedStatus DerivedStatus{get;set;}
}
带有数据注释的派生类如下所示:

公共类基本状态
{
[钥匙,外国钥匙(“骑手”)]
公共int ID{get;set;}
公共场所?已婚{get;set;}
公共虚拟骑手{get;set;}
}
公共类DerivedStatus:BaseStatus
{
公共房屋?房屋所有权{get;set;}
}
对于DbContext,我刚刚添加了以下内容来创建一个按预期工作的表(所有属性都在一个带有鉴别器列的表中)

当更新数据库的时候,我也在给它植入一些测试数据,我猜是在它发现这个问题的时候

这是我第一次在实体中使用继承,我不确定问题出在哪里。我曾尝试删除数据库并重新运行迁移,正如我所读到的,这有时会导致问题,但我收到了相同的错误消息


未来可能会有更多的BaseStatus和Rider类的派生类,不同的派生类使用不同的状态类,因此任何解决方案都必须是可伸缩的。可能当项目增长时,我会从每个层次结构的表更改为每个类型的表,但现在我想要一个TPH的解决方案(如果可能)

检查表中的值,这些值是否有效(遵循外键约束)

我终于找到了答案

问题的一部分是我不知道我要完成的事情的词组,所以很难找到答案。如果你想实现和我一样的目标,你需要的短语是多态关联。我终于在这篇文章中找到了我想要的东西

要更正我的代码,我所需要做的就是从依赖类中删除外键和导航属性,同时将导航属性保留在Rider中

公共类附加条款
{
公共int ID{get;set;}
公共虚拟DerivedStatus DerivedStatus{get;set;}
}
公共类基本状态
{
[关键]
公共int ID{get;set;}
公共场所?已婚{get;set;}
}
公共类DerivedStatus:BaseStatus
{
公共房屋?房屋所有权{get;set;}
}
DbContext与以前一样。经过测试,这也适用于TPT,您只需要添加数据注释,使实体创建的表成为单独的表

更新:经过更多的测试,我发现你可以在基类上使用外键和导航属性,但是你需要用Fluent API补充数据注释,因为我似乎无法让它自己工作。我使用的Fleunt API是:

modelBuilder.Entity()
.HasRequired(e=>e.Rider)
.with可选(e=>e.DerivedStatus)
.WillCascadeOnDelete(真);
public DbSet<BaseStatus> Status { get; set; }