c# - 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++ - 为什么我的 vector::erase 调用会抛出“vector subscript out of range”?
- ios - Swift iOS 应用程序 - 更改故事板 segue 类型的问题 - 无法从模态更改为显示
- django - 如何将 Django 日期时间转换为 HighCharts 格式
- javascript - 使用 javascript 下载 youtube 视频/音频流
- angular - 当用户仅通过输入查询来搜索选项时,matautocomplete 应该进行过滤
- flutter - 在屏幕中心对齐文本
- api - Http POST 在 Postman 中有效,但在 Flutter 中无效
- node.js - Node-Postgres SequelizeConnectionError:用户的密码验证失败
- c++ - 如何获取当前用户的默认RAS电话簿路径?
- mongodb - Mongo 平衡器如何处理散列分片键