我有界定有兩個一個一對多的關係(兩個列表)多一個相同的實體類型代碼的許多關係第一
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();
我想這個問題是我有兩個一個一對多的關係,同一類型的實體,但我不知道做正確的方式。
謝謝@Slauma!這解決了我的問題。你對bool屬性是正確的,實際上我使用了兩個不同的實體,它們是從Appointment繼承而來的。無論如何,我不明白哪個是我的映射問題,但現在我:) – moarra
我正在嘗試做類似的事情。我有一個有電子郵件和電話的聯繫人。我想將電子郵件和電話結合在一個名爲CONTACTINFO的實體中,該實體可以具有ContactInfoType屬性(Enum)來區分它們。如果有一種方法在模型構建器中使用默認的WHERE子句/條件來導航屬性? – Yashvit