首页 > 解决方案 > 3 个实体之间的三元关系导致实体框架“可能导致循环或多个级联路径”错误

问题描述

我试图弄清楚我在做什么与众不同,导致 Update-Database 命令告诉我以下内容:

引入 FOREIGN KEY 约束

表“ProjectOwnerProduct”上的“FK_ProjectOwnerProduct_ProjectProduct_ProjectId_ProductId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

警告!聚集索引的最大键长度为 900 字节。索引“PK_ProjectOwnerProduct”的最大长度为 908 字节。对于较大值的某些组合,插入/更新操作将失败。

我有以下实体结构:

3个顶级实体:
项目(PK:ProjectId)
所有者(PK:OwnerId)
产品(PK:ProductId)

多对多连接表
ProjectOwner (PK: ProjectId, PK: OwnerId)
ProjectProduct (PK: ProjectId, PK: ProductId)

处理项目内所有者和产品之间的关系:
ProjectOwnerProduct (PK: ProjectId, PK: OwnerId, PK: ProductId)

这是我流畅的 API 声明:

        // ** KEY SPECIFICATIONS **
        modelBuilder.Entity<ProjectOwner>()
            .HasKey(x => new { x.ProjectId, x.OwnerId});

        modelBuilder.Entity<ProjectProduct>()
            .HasKey(x => new { x.ProjectId, x.ProductId});

        modelBuilder.Entity<ProjectOwnerProduct>()
            .HasKey(x => new { x.ProjectId, x.OwnerId, x.ProductId});

        // Project Owner
        modelBuilder.Entity<ProjectOwner>()
            .HasOne(x => x.Project)
            .WithMany(x => x.ProjectOwners)
            .HasForeignKey(x => x.ProjectId);

        modelBuilder.Entity<ProjectOwner>()
            .HasOne(x => x.Owner)
            .WithMany(x => x.ProjectOwners)
            .HasForeignKey(x => x.OwnerId);

        // Project Product
        modelBuilder.Entity<ProjectProduct>()
            .HasOne(x => x.Project)
            .WithMany(x => x.ProjectProducts)
            .HasForeignKey(x => x.ProjectId);

        modelBuilder.Entity<ProjectProduct>()
            .HasOne(x => x.Product)
            .WithMany()
            .HasForeignKey(x => x.ProductId);

        // Project Owner Product
        modelBuilder.Entity<ProjectOwnerProduct>()
            .HasOne(x => x.Project)
            .WithMany(x => x.ProjectOwnerProducts)
            .HasForeignKey(x => x.ProductId);

        modelBuilder.Entity<ProjectOwnerProduct>()
            .HasOne(x => x.Owner)
            .WithMany(x => x.ProjectOwnerProducts)
            .HasForeignKey(x => x.OwnerId);

        modelBuilder.Entity<ProjectOwnerProduct>()
            .HasOne(x => x.Product)
            .WithMany()
            .HasForeignKey(x => x.ProductId);

如果一个项目被删除,我希望它的所有 ProjectOwners 和 ProjectProducts 都会被删除。此外,它的所有 ProjectOwnerProducts。

如果 ProjectOwner 被删除,我希望所有包含该 ProjectId,OwnerId 组合的 ProjectOwnerProducts 都会被删除。

如果 ProjectProduct 被删除,我希望所有包含该 ProjectId,ProductId 组合的 ProjectOwnerProducts 都会被删除。

我不明白它为什么抱怨...

标签: c#sql-serverentity-frameworkasp.net-coreentity-framework-core

解决方案


推荐阅读