我有两个类,它们是从相同的基类派生的,并具有相同的必需属性。它们在同一表(TPH)中。
当我尝试创建数据库时,出现此异常:
System.Data.SqlClient.SqlException:引入外键 表'As'上的约束'FK_As_Bs_A2BId'可能导致循环或多个 级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或 修改其他FOREIGN KEY约束。无法创建约束或 指数。查看以前的错误。
public class Entity
{
public long Id { get; set; }
}
public abstract class A : Entity { }
public class A1 : A
{
[Required]
public B A1B { get; set; }
}
public class A2 : A
{
[Required]
public B A2B { get; set; }
}
public class B : Entity { }
public class MyContext : DbContext
{
public MyContext(DbContextOptions options) : base(options)
{
}
public DbSet<A> As { get; set; }
public DbSet<A1> A1s { get; set; }
public DbSet<A2> A2s { get; set; }
public DbSet<B> Bs { get; set; }
}
public class CreateDbTests
{
[Fact]
public void CreateDb()
{
var optionsBuilder = new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer("YOURCONNECTIONSTRING");
using (var context = new MyContext(optionsBuilder.Options))
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
}
}
}
有人可以向我解释这个问题吗?我不明白几乎会认为这是一个错误。
仅当两个实体的属性都具有必需属性并且都在同一表(TBH)中时,才会出现此问题。当A1和A2获得自己的表时(不添加DbSet<A>
)没有问题。
答案 0 :(得分:3)
这不是错误,而是SqlServer(和其他一些)数据库的限制。当一个表与另一个表具有多个级联FK关系时,就会发生这种情况。
在您的情况下,这是由TPH引起的,但是如果您有,则同样会发生
Ethernet 1: 169.254.146.100
Ethernet 2: 169.254.147.100
TPH使用单个表存储所有派生实体,因此所有单个表都受到FK关系限制。
要在两种情况下都解决此问题,您需要通过关闭所涉及的关系中的至少一个的级联删除,并手动或通过数据库触发器来处理删除,来打破“多个级联路径”的“级联”部分。