Тройная связь между 3 объектами вызывает Entity Framework, которая может «вызвать циклы или несколько каскадных путей» - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь выяснить, что я делаю необычно, чтобы команда 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 комбинированный удаляется.

Я не понимаю, почему он жалуется ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...