具有相同必需属性类型的EF Core TPH实体导致“引入外键约束”异常

时间:2019-03-19 14:00:58

标签: .net foreign-keys entity-framework-core

我有两个类,它们是从相同的基类派生的,并具有相同的必需属性。它们在同一表(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>)没有问题。

1 个答案:

答案 0 :(得分:3)

这不是错误,而是SqlServer(和其他一些)数据库的限制。当一个表与另一个表具有多个级联FK关系时,就会发生这种情况。

在您的情况下,这是由TPH引起的,但是如果您有,则同样会发生

Ethernet 1: 169.254.146.100
Ethernet 2: 169.254.147.100

TPH使用单个表存储所有派生实体,因此所有单个表都受到FK关系限制。

要在两种情况下都解决此问题,您需要通过关闭所涉及的关系中的至少一个的级联删除,并手动或通过数据库触发器来处理删除,来打破“多个级联路径”的“级联”部分。