【问题标题】:1:1 self relation in EFEF中的1:1自我关系
【发布时间】:2017-04-18 09:53:54
【问题描述】:

我有一个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)。

模型生成器代码:

   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()吗?

【问题讨论】:

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


【解决方案1】:

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

兄弟关系不是必需的,将其全部删除并替换为数字类型的 SortOrder 列。然后父级应返回基于此类型的排序列表/集合。日程项目不必知道与其相邻的下一个/上一个日程项目,让家长担心。

所以替换

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

// sort from low-to-high in the context of a collection
public int SortOrder { get; set; }

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多