У меня проблемы с написанием 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 может вызвать циклы или несколько каскадных путей - почему? ), но все еще не имеет понятия, как это исправить. Любое решение этой проблемы будет с благодарностью, спасибо!
Если требуется более подробная информация о коде, пожалуйста, дайте мне знать, и я добавлю их!