Множественный цикл в структуре сущностей Code First Approach

public class Admission
{
    [Required]
    public int AdmissionId { get; set; }

    [Required]
    public int SscInformationId { get; set; }

    [Required]
    public int HscInformationId { get; set; }

    public SscInformation SscInformation { get; set; }

    public HscInformation HscInformation { get; set; }
 }

public class HscInformation
{
    [Required]
    public int HscInformationId { get; set; }

    [Required]
    public int EducationBoardId { get; set; }

    [Required]
    public int RollNumber { get; set; }

    [Required]
    public int PassingYear { get; set; }

    public EducationBoard EducationBoard { get; set; }
}

public class SscInformation
{
    [Required]
    public int SscInformationId { get; set; }

    [Required]
    public int EducationBoardId { get; set; }

    [Required]
    public int RollNumber { get; set; }

    [Required]
    public int PassingYear { get; set; }

    public EducationBoard EducationBoard { get; set; }
}

public class EducationBoard
{
    [Required]
    public int EducationBoardId { get; set; }

    [Required(ErrorMessage = "Education Board Name is required.")]
    [Display(Name = "Education Board Name")]
    public string EducationBoardName { get; set; }
}

Это моя модель данных. Когда я пытаюсь создать базу данных, используя первый подход кода в рамках сущности, это дает мне следующую ошибку:

Введение ограничения FOREIGN KEY «FK_dbo.SscInformations_dbo.EducationBoards_EducationBoardId» в таблице «SscInformations» может вызвать циклы или множественные каскадные пути. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. См. предыдущие ошибки.

Как я могу это решить??


person Mahedi Sabuj    schedule 28.11.2014    source источник


Ответы (1)


И SscInformation, и SscInformation имеют обязательное значение EducationBoard (поскольку требуется EducationBoardId). Это означает, что для этих ассоциаций по умолчанию включено каскадное удаление.

Итак, предположим, что у вас есть EducationBoard, на который ссылаются SscInformation и SscInformation. Если вы удалите этот EducationBoard, каскадное удаление также захочет удалить эти ссылающиеся объекты. Это множественный каскадный путь.

Ограничение сервера Sql не разрешает множественные (или циклические) каскадные пути, поэтому SqlException возникает, когда EF пытается построить базу данных.

Вы должны сделать хотя бы одну из ассоциаций не каскадной, например.

modelBuilder.Entity<SscInformation>()
    .HasRequired(s => s.EducationBoard).WithRequiredDependent()
    .WillCascadeOnDelete(false);

(в переопределении OnModelCreating контекста.)

person Gert Arnold    schedule 29.11.2014
comment
Спасибо @ Герт Арнольд. Оно работает. Но это создает связь «один ко многим» между «SscInformation» и «EducationBoard». Я хочу сделать отношения один к одному между этим. Есть ли способ к этому ?? - person Mahedi Sabuj; 29.11.2014