2 개의 일대 다 관계 (2 개의 목록)가있는 엔티티를 정의하는 데 문제가 있습니다.
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();
문제는 동일한 유형의 엔티티에 대해 두 개의 일대 다 관계가 있지만 올바르게 만드는 방법을 모른다는 것입니다.
매핑의 실수는 Appointment.Calendar
두 개의 다른 관계에 대해 두 번 사용한다는 것 입니다. 그건 불가능하다. 두 번째 쌍의 FK 및 탐색 속성이 필요합니다 Appointment
(또는 역 속성없이 하나의 관계를 매핑).
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.Appointments
일종의 지위를 가져야한다고 생각 합니다. 그런 다음 항상을 사용하여 캘린더 항목의 여유 슬롯을 추출 할 수 있습니다.Appointment
bool IsFree
calendar.Appointments.Where(a => a.IsFree)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다