EF中1:1的自我关系

时间:2017-04-18 09:53:55

标签: c# sql entity-framework ef-model-builder

我有ScheduleItem

类型的对象
 public class ScheduleItem : EntityBase
    {
        [MaxLength(500)]
        [Required]
        public string TitleAr { get; set; }

        [MaxLength(300)]
        [Required]
        public string TitleEn { get; set; }
        public int? ParentScheduleItemId { get; set; }


        public int? PreviousDestinationId { get; set; }
        public int? NextDestinationId { get; set; }

        public ScheduleItem ParentScheduleItem { get; set; }

        [InverseProperty("ParentScheduleItem")]
        public ICollection<ScheduleItem> ChildrenScheduleItems { set; get; }

        public ScheduleItem PreviousDestination { get; set; }
        public ScheduleItem NextDestination { get; set; }

}

这个对象是父对象,里面有一个子集合。

每个孩子都有一个对下一个孩子的可选引用(最后一个孩子将有NextDestinationId = null)和对前一个孩子的可选引用(PreviousDestinationId对于第一个孩子应为null)。

enter image description here

模型构建器代码:

   modelBuilder.Entity<ScheduleItem>().HasOptional(t => t.NextDestination).WithMany().HasForeignKey(t => t.NextDestinationId);
        modelBuilder.Entity<ScheduleItem>().HasOptional(t => t.PreviousDestination).WithMany().HasForeignKey(t => t.PreviousDestinationId);

但是,保存时我收到此错误 无法确定相关操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。

这个问题的解决方案是什么?我必须两次致电SaveChanges()吗?

1 个答案:

答案 0 :(得分:2)

解决方案是重新考虑关系和结构。我没有对父/子关系发表评论,因为你没有解释为什么需要相同类型的父(递归关系)。

不需要兄弟关系,将它们全部删除并将其替换为数字类型的SortOrder列。然后,父级应该根据此类型返回已排序的列表/集合。计划项目不应该知道与它们相邻的下一个/上一个计划项目,让父母担心这一点。

所以替换

$(function(){ $(document).foundation(); });

public int? PreviousDestinationId { get; set; }
public int? NextDestinationId { get; set; }
public ScheduleItem PreviousDestination { get; set; }
public ScheduleItem NextDestination { get; set; }