1:EF

2017-04-18 65 views
1

1自我的關係我有型ScheduleItem1:EF

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應該爲空)。

enter image description here

型號Builder代碼:

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()兩次嗎?

+0

的可能的複製[如何映射實體框架代碼優先方法自我遞推關係](http://stackoverflow.com/questions/ 12656914/how-to-map-recursive-relation-on-self-in-entity-framework-code-first-approach)@OP:勾選這個答案。 Imho,這是一個完美的解決方案 –

回答

2

解決方案是重新考慮關係和結構。我沒有評論父母/子女關係,因爲你沒有解釋爲什麼同一類型的父母(遞歸關係)是必要的。

兄弟姐妹關係不是必需的,將它們全部刪除並用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; }