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

时间:2019-02-14 17:39:28

标签: c# sql-server entity-framework asp.net-core entity-framework-core

我试图弄清楚我在做什么,以使Update-Database命令告诉我以下内容:

引入FOREIGN KEY约束

  

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

  

警告!聚集索引的最大密钥长度为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都被删除。

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

0 个答案:

没有答案