Я пытаюсь выяснить, что я делаю необычно, чтобы команда Update-Database сообщала мне следующее:
Введение ограничения FOREIGN KEY
'FK_ProjectOwnerProduct_ProjectProduct_ProjectId_ProductId 'в таблице' ProjectOwnerProduct 'может вызывать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.
и
Внимание!Максимальная длина ключа для кластеризованного индекса составляет 900 байтов.Индекс PK_ProjectOwnerProduct имеет максимальную длину 908 байтов.Для некоторой комбинации больших значений операция вставки / обновления завершится неудачей.
У меня есть следующая структура сущностей:
3 сущности верхнего уровня:
Project (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 будет удален, я ожидаю, что все ProjectOwnerProducts, содержащие этот ProjectId, комбинацию OwnerId, будут удалены.
Если ProjectProduct будет удален, я ожидаю, что все ProjectOwnerProducts, содержащиеэтот ProjectId, ProductId комбинированный удаляется.
Я не понимаю, почему он жалуется ...