Проблемы с отношением многие ко многим в ядре EF - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь установить отношение «многие ко многим» между сущностью Project и сущностью Resource. Я создал объект отношения: ProjectResource. Я установил отношение, используя свободный API, как это:

modelBuilder.Entity<ProjectResource>()
    .HasKey(pr => new { pr.ProjectId, pr.ResourceId });

modelBuilder.Entity<ProjectResource>()
    .HasOne(pr => pr.Project)
    .WithMany(p => p.ProjectResources)
    .HasForeignKey(pr => pr.ProjectId);

modelBuilder.Entity<ProjectResource>()
    .HasOne(pr => pr.Resource)
    .WithMany(r => r.ProjectResources)
    .HasForeignKey(pr => pr.ResourceId);

Вот краткое определение моих классов Project и Resources ( Я включаю только эти отношения ):

public class Resource
{
    public Guid DepartmentId { get; set; }
    public Department Department { get; set; }

    public Guid? ManagerId { get; set; }
    public Resource Manager { get; set; }

    public ICollection<Resource> Resources { get; set; }
    public ICollection<ProjectResource> ProjectResources { get; set; }
    public ICollection<ChangeLog> ChangeLogs { get; set; }
    public ICollection<Requirement> Requirements { get; set; }
    public ICollection<UseCase> UseCases { get; set; }  
}

public class Project
{
    public Guid ResponsibleId { get; set; }
    public Resource Responsible { get; set; }

    public ICollection<ProjectResource> ProjectResources { get; set; }
    public ICollection<BusinessNeed> BusinessNeeds { get; set; }
    public ICollection<SuccessCriteria> SuccessCriterias { get; set; }
    public ICollection<Requirement> Requirements { get; set; }
    public ICollection<UseCase> UseCases { get; set; }
    public ICollection<ChangeLog> ChangeLogs { get; set; }
    public ICollection<GlossaryWord> GlossaryWords { get; set; }
}

public class ProjectResource
{
    public Guid ProjectId { get; set; }
    public Project Project { get; set; }
    public Guid ResourceId { get; set; }
    public Resource Resource { get; set; }
}

Я исследовал проблему и, похоже, не могу найти решение. Я сделал так же, как описано руководство здесь .

Я получаю следующую ошибку:

Введение ограничения FOREIGN KEY 'FK_ProjectResources_Resources_ResourceId' в таблицу 'ProjectResources' может привести к возникновению циклов или нескольких каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.

Что именно я делаю не так?

1 Ответ

0 голосов
/ 08 ноября 2018

Проблема вызвана существующим требуемым (следовательно, каскадным удалением ) отношением один-ко-многим между Resource и Project, выраженным Responsible / ResponsibleId свойства в Project.

Вот несколько каскадных путей от Resource до ProjectResource:

Resource (Id) -> (ResponsibleId) Project (Id) -> (ProjectId) ProjectResource
Resource (Id) -> (ResourceId) ProjectResource

Единственный способ разрешить несколько каскадных путей - разорвать цикл, отключив каскадное удаление хотя бы для одного из отношений, и обработать удаление вручную или с помощью триггера базы данных.

Для этой конкретной модели, вероятно, проще всего было бы отключить каскад удаления для отношения Resource -> Project:

modelBuilder.Entity<Project>()
    .HasOne(p => p.Responsible)
    .WithMany()
    .OnDelete(DeleteBehavior.Restrict);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...