EF Core DeleteBehavior.Cascade可能会导致循环或多个级联路径

马修·弗林

我有以下实体(为简洁起见,以下简称);

public class Trader : AuditableEntity
{
    public int? UserId { get; set; }
    public ApplicationUser User { get; set; }

    public int? AccountManagerId { get; set; }
    public ApplicationUser AccountManager { get; set; }

    public List<TraderContactHistory> ContactHistory { get; set; }
}

public class ApplicationUser : IdentityUser<int>, IEntity
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Level { get; set; }

    public DateTime JoinDate { get; set; }
    public DateTime? LastLogin { get; set; }

    public ApplicationUserImage ProfileImage { get; set; }
}

为了完整起见,TraderContactHistory如下:

public class TraderContactHistory : Entity
{
    public Trader Trader { get; set; }
    public DateTime ContactDate { get; set; }
    public ApplicationUser ContactedBy { get; set; }
    public bool RequestedCallbackLater { get; set; }
    public string Notes { get; set; }
}

现在添加约束后;

public override void Configure(EntityTypeBuilder<Trader> entity)
{
    entity.HasOne(x => x.User)
        .WithOne()
        .HasForeignKey<Trader>(x => x.UserId)
        .OnDelete(DeleteBehavior.Restrict);
}

以下内容(因为我们现在需要删除交易者时清除相关用户);

public override void Configure(EntityTypeBuilder<Trader> entity)
{
    entity.HasOne(x => x.User)
        .WithOne()
        .HasForeignKey<Trader>(x => x.UserId)
        .OnDelete(DeleteBehavior.Cascade);

    entity.HasOne(x => x.AccountManager)
        .WithMany()
        .HasForeignKey(x => x.AccountManagerId)
        .OnDelete(DeleteBehavior.SetNull);
}

为了完整起见,TraderContactHistory配置是;

    public override void Configure(EntityTypeBuilder<TraderContactHistory> entity)
    {
        entity.HasKey(x => x.Id);

        entity.HasOne(x => x.Trader)
            .WithMany(x => x.ContactHistory)
            .OnDelete(DeleteBehavior.Restrict);

        entity.HasOne(x => x.ContactedBy)
            .WithMany()
            .OnDelete(DeleteBehavior.Restrict);

    }

产生以下迁移;

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_Traders_AspNetUsers_UserId",
            schema: "Bemfeito",
            table: "Traders");

        migrationBuilder.AddForeignKey(
            name: "FK_Traders_AspNetUsers_UserId",
            schema: "Bemfeito",
            table: "Traders",
            column: "UserId",
            principalSchema: "Bemfeito",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    }

运行时导致以下错误update-database(我正在运行MSSQL数据库);

System.Data.SqlClient.SqlException(0x80131904):在表“ Traders”上引入FOREIGN KEY约束“ FK_Traders_AspNetUsers_UserId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

谁能看到为什么会这样吗?可能是与的TraderContactHistory链接Trader无声地造成了这种情况吗?由于我目前没有配置设置?

哨兵

数据模型中的外键关系如下所示:

  • 交易者-> * ApplicationUser
  • 交易者-> * ApplicationUser
  • TraderContactHistory->交易者
  • TraderContactHistory-> ApplicationUser

因此,如果删除ApplicationUser条目,则级联删除将删除所有Trader条目和指向它的所有TraderContactHistory条目。但是,删除操盘手条目也将删除相应的操盘手条目。因此,您有两个从ApplicationUser到TraderContactHistory的级联删除路径:

  • TraderContactHistory-> ApplicationUser
  • TraderContactHistroy-> Trader-> ApplicationUser

MSSQL不喜欢这样。相信我,我知道这会令人讨厌,因为我必须定期处理此限制。

话虽如此,您在TraderContactHistory的关系中指定了“ Restrict”,可以解决该问题。也许实际的模式不能正确反映出来?

编辑:
在我看来,另一个直接的Trader-ApplicationUser-relationship可能是罪魁祸首。如果将Trader-AccountManager-dependency设置为OnDelete Cascade,您还将获得多个级联路径。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ef core 2 - 在表“Y”上引入 FOREIGN KEY 约束“X”可能会导致循环或多个级联路径

来自分类Dev

具有可选关系的EF Core 3.1 DeleteBehavior.SetNull引发约束异常

来自分类Dev

带有DeleteBehavior.Restrict的EF核心级联参照完整性无法正常工作

来自分类Dev

EF6代码优先-可能导致循环或多个级联路径

来自分类Dev

EF Core 导航属性循环

来自分类Dev

EF Core审核级联删除的值

来自分类Dev

引入FOREIGN KEY约束可能会导致循环或多个级联路径

来自分类Dev

引入FOREIGN KEY约束可能会导致循环或多个级联路径

来自分类Dev

实体框架,外键约束可能会导致循环或多个级联路径

来自分类Dev

FOREIGN KEY可能会导致循环或多个级联路径异常

来自分类Dev

引入FOREIGN KEY约束可能会导致循环或多个级联路径

来自分类Dev

SQL Server 引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

来自分类Dev

EF Core创建多个外键列

来自分类Dev

ASP.NET 5(MVC6)EF7外键可能会导致循环

来自分类Dev

引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定删除时不执行任何操作

来自分类Dev

如何防止错误:在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径

来自分类Dev

实体框架代码的第一个外键可能会导致循环或多个级联路径

来自分类Dev

EF Core和Azure

来自分类Dev

EF Core执行SQL

来自分类Dev

EF Core中的IsNumeric

来自分类Dev

EF Core包含查询

来自分类Dev

编码MySql EF Core

来自分类Dev

更新 ContextModelSnapshot EF Core

来自分类Dev

EF Core 多导航属性产生循环依赖

来自分类Dev

在EF Core中是否可能需要单向导航属性?

来自分类Dev

EF Core 迁移可能具有破坏性?

来自分类Dev

EF Core 1.0-Include()生成多个查询

来自分类Dev

EF CORE映射到同一表的多个属性

来自分类Dev

EF Core 3.0:实体中的多个导航属性

Related 相关文章

  1. 1

    ef core 2 - 在表“Y”上引入 FOREIGN KEY 约束“X”可能会导致循环或多个级联路径

  2. 2

    具有可选关系的EF Core 3.1 DeleteBehavior.SetNull引发约束异常

  3. 3

    带有DeleteBehavior.Restrict的EF核心级联参照完整性无法正常工作

  4. 4

    EF6代码优先-可能导致循环或多个级联路径

  5. 5

    EF Core 导航属性循环

  6. 6

    EF Core审核级联删除的值

  7. 7

    引入FOREIGN KEY约束可能会导致循环或多个级联路径

  8. 8

    引入FOREIGN KEY约束可能会导致循环或多个级联路径

  9. 9

    实体框架,外键约束可能会导致循环或多个级联路径

  10. 10

    FOREIGN KEY可能会导致循环或多个级联路径异常

  11. 11

    引入FOREIGN KEY约束可能会导致循环或多个级联路径

  12. 12

    SQL Server 引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

  13. 13

    EF Core创建多个外键列

  14. 14

    ASP.NET 5(MVC6)EF7外键可能会导致循环

  15. 15

    引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定删除时不执行任何操作

  16. 16

    如何防止错误:在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径

  17. 17

    实体框架代码的第一个外键可能会导致循环或多个级联路径

  18. 18

    EF Core和Azure

  19. 19

    EF Core执行SQL

  20. 20

    EF Core中的IsNumeric

  21. 21

    EF Core包含查询

  22. 22

    编码MySql EF Core

  23. 23

    更新 ContextModelSnapshot EF Core

  24. 24

    EF Core 多导航属性产生循环依赖

  25. 25

    在EF Core中是否可能需要单向导航属性?

  26. 26

    EF Core 迁移可能具有破坏性?

  27. 27

    EF Core 1.0-Include()生成多个查询

  28. 28

    EF CORE映射到同一表的多个属性

  29. 29

    EF Core 3.0:实体中的多个导航属性

热门标签

归档