1

我有界定有兩個一個一對多的關係(兩個列表)多一個相同的實體類型代碼的許多關係第一

public class Calendar 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public Guid ID { get; set; } 


    public virtual IList<Appointment> FreeSlots { get; set; } 
    public virtual IList<Appointment> AppointmentsList { get; set; } 
    ... 
} 

public class Appointment 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int AppointmentID { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
    public String Type { get; set; }  
    public String Info { get; set; } 
    public Guid CalendarID { get; set; }  
    public virtual Calendar Calendar { get; set; } 
} 

和代碼第一碼的實體問題:

modelBuilder.Entity<Appointment>().HasKey(u => new {u.AppointmentID, u.CalendarID }); 
     modelBuilder.Entity<Appointment>().HasRequired(u => u.Calendar).WithMany(c => c.FreeSlots).HasForeignKey(f => f.CalendarID).WillCascadeOnDelete(true); 
     modelBuilder.Entity<Appointment>().HasRequired(u => u.Calendar).WithMany(c => c.AppointmentsList).HasForeignKey(f => f.CalendarID).WillCascadeOnDelete(true); 

約會有兩個PK,因爲如果日曆被刪除,我想要約會被刪除。

當我嘗試將新的約會添加到FreeSlot時,出現以下錯誤: 保存不爲其關係提供外鍵屬性的實體時發生錯誤。 EntityEntries屬性將返回null,因爲單個實體不能被識別爲異常的來源。

我也嘗試過使用這個映射,也沒有運氣:錯誤0040:類型Calendar_FreeSlots沒有在命名空間Project.DAL(Alias = Self)中定義。

modelBuilder.Entity<Appointment>().HasKey(u => new {u.AppointmentID, u.CalendarID });   
     modelBuilder.Entity<Calendar>().HasMany(c => c.FreeSlots).WithRequired(c => c.Calendar).HasForeignKey(c => c.CalendarID).WillCascadeOnDelete(); 
     modelBuilder.Entity<Calendar>().HasMany(c => c.AppointmentsList).WithRequired(c => c.Calendar).HasForeignKey(c => c.CalendarID).WillCascadeOnDelete(); 

我想這個問題是我有兩個一個一對多的關係,同一類型的實體,但我不知道做正確的方式。

回答

3

映射中的錯誤是,您對兩個不同的關係使用兩次Appointment.Calendar兩次。這是不可能的。您需要在Appointment第二對FK和導航性能(或地圖,而相反的性質一對一的關係):

modelBuilder.Entity<Calendar>() 
    .HasMany(c => c.FreeSlots) 
    .WithRequired(c => c.Calendar1) 
    .HasForeignKey(c => c.Calendar1ID) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Calendar>() 
    .HasMany(c => c.AppointmentsList) 
    .WithRequired(c => c.Calendar2) 
    .HasForeignKey(c => c.Calendar2ID) 
    .WillCascadeOnDelete(true); 

(對於至少一個關係,你必須禁用級聯刪除,否則你就會有結束。多重級聯刪除例外。)

但是,我覺得你實際上應該只有一個關係,收集Calendar.AppointmentsAppointment中的一種狀態,就像bool IsFree屬性一樣。然後您可以始終使用calendar.Appointments.Where(a => a.IsFree)提取日曆項的空閒插槽。

+0

謝謝@Slauma!這解決了我的問題。你對bool屬性是正確的,實際上我使用了兩個不同的實體,它們是從Appointment繼承而來的。無論如何,我不明白哪個是我的映射問題,但現在我:) – moarra

+0

我正在嘗試做類似的事情。我有一個有電子郵件和電話的聯繫人。我想將電子郵件和電話結合在一個名爲CONTACTINFO的實體中,該實體可以具有ContactInfoType屬性(Enum)來區分它們。如果有一種方法在模型構建器中使用默認的WHERE子句/條件來導航屬性? – Yashvit

相關問題