代码优先实体框架的多周期

时间:2014-11-28 19:34:40

标签: database entity-framework-6 ef-migrations

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; }
}

这是我的数据模型。当我尝试使用实体框架中的代码第一种方法创建数据库时,它给出了以下错误:

  

在表'SscInformations'上引入FOREIGN KEY约束'FK_dbo.SscInformations_dbo.EducationBoards_EducationBoardId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。   无法创建约束或索引。查看以前的错误。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

SscInformationSscInformation都必须EducationBoard(因为EducationBoardId是必需的)。这意味着默认情况下这些关联已启用级联删除。

假设您有一个由EducationBoard SscInformation引用的SscInformation。如果删除此EducationBoard,则级联删除也会删除这些引用对象。这是一个多级联路径

不允许多个(或循环)级联路径的Sql Server限制,因此当EF尝试构建数据库时会发生SqlException

您必须至少制作一个非级联的关联,例如

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

(在上下文的OnModelCreating覆盖中。)