Entity Framework Core Self Reference и отношение один ко многим к другой таблице - PullRequest
0 голосов
/ 27 января 2020

У меня проблемы с написанием EF-кода для таблицы с самоссылкой и ее отношений с другими таблицами. Моя таблица WorkPackage имеет иерархию (рабочие пакеты могут содержать меньшие рабочие пакеты), поэтому она сама ссылается на себя. Он имеет отношения один ко многим с TimesheetRow. Мой код для этого:

public class WorkPackage
    {
        [Key]
        public int WorkPackageId { get; set; }
        [ForeignKey("ProjectId")]
        public int ProjectId { get; set; }

        public string WorkPackageName { get; set; }
        public string WorkPackageDescription { get; set; }
        public double WorkPackageCost { get; set; }

        public IList<EmployeeWorkPackageAssignment> EmployeeWorkPackageAssignments { get; set; }
        public Project Project { get; set; }

        //Self-Reference Relationship
        public int? ParentWorkPackageId { get; set; }
        public virtual WorkPackage ParentWorkPackage { get; set; }
        public virtual IList<WorkPackage> ChildrenWorkPackages { get; set; }

        public IList<TimesheetRow> TimesheetRows { get; set; }
    }

Моя таблица TimesheetRow имеет отношение много к одному с WorkPackage, и я разработал класс следующим образом:

public class TimesheetRow
{
        public int TimesheetRowId { get; set; }

        public int TimesheetId { get; set; }
        public int WorkPackageId { get; set; }
        public int ProjectId { get; set; }

        public int Hours{get; set;}

        public Timesheet Timesheet { get; set; }
        public WorkPackage WorkPackage { get; set; }
}

Класс расписания для справки:

 public class Timesheet
    {
        public int TimesheetId { get; set; }
        public int EmployeeId { get; set; }

        public int WeekNumber { get; set; }

        public Employee Employee { get; set; }
        public IList<TimesheetRow> TimesheetRows { get; set; }
    }

Вот как я настроил отношения в OnModelCreating. Я опустил нерелевантный код.

 modelBuilder.Entity<WorkPackage>().HasOne(wp => wp.ParentWorkPackage)
                .WithMany(wp => wp.ChildrenWorkPackages)
                .HasForeignKey(wp => wp.ParentWorkPackageId)
                .OnDelete(DeleteBehavior.NoAction);

 modelBuilder.Entity<TimesheetRow>().HasOne(tr => tr.Timesheet)
                .WithMany(tr => tr.TimesheetRows)
                .HasForeignKey(tr => new { tr.TimesheetId})
                .OnDelete(DeleteBehavior.NoAction);

 modelBuilder.Entity<TimesheetRow>().HasOne(tr => tr.WorkPackage)
                .WithMany(tr => tr.TimesheetRows)
                .HasForeignKey(tr => tr.WorkPackageId)
                .OnDelete(DeleteBehavior.NoAction);

После создания миграции я получаю сообщение об ошибке при обновлении базы данных: Introducing FOREIGN KEY constraint 'FK_TimesheetRows_WorkPackages_WorkPackageId' on table 'TimesheetRows' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Я осмотрел SO и увидел связанные темы (такие как Введение в FOREIGN Ограничение KEY может вызвать циклы или несколько каскадных путей - почему? ), но все еще не имеет понятия, как это исправить. Любое решение этой проблемы будет с благодарностью, спасибо!

Если требуется более подробная информация о коде, пожалуйста, дайте мне знать, и я добавлю их!

...