[英]Multiple Foreign Keys to one entity
我正在開發一種系統,志願者可以將其申請成為教堂的儀式/任命的一部分。
我想要這樣,以便多個志願者可以參加儀式,可能是1或可能是4。我在SO上看到過各種示例,它們僅使用兩個外鍵,但是我不能將頭纏繞在兩個以上。 我知道我需要逆屬性,但我只是感到困惑。
這是我需要的兩個實體。 我想我需要作為ICollection參加志願者的約會/儀式。 我可能不太了解,我不太確定。
public class Volunteer
{
[Key]
public int VolunteerId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public bool GardaVetted { get; set; }
public string VolunteerRole { get; set; }
public string VolunteerPhoneNumber { get; set; }
[ForeignKey("Church")]
public int ChurchId { get; set; }
[ForeignKey("Appointments")]
public int AppointmentId { get; set; }
//Foreign Key
public virtual Church Church { get; set; }
public virtual ICollection<Appointments> Appointments { get; set; }
}
public class Appointments
{
[Key]
public int AppointmentId { get; set; }
public string DetailsOfAppointment { get; set; }
public int? Fee { get; set; }
public string RoomType { get; set; }
public string NameOfApplicant { get; set; }
public string ApplicantPhoneNumber { get; set; }
public string ApplicantEmail { get; set; }
[DataType(DataType.DateTime)]
[DisplayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
public DateTime DateOfAppointment { get; set; }
public string ThemeColour { get; set; }
public Boolean Confirmed { get; set; }
[ForeignKey("Admins")]
public int AdministrationId { get; set; }
[ForeignKey("Church")]
public int ChurchId { get; set; }
//[ForeignKey("Volunteers")]
//public int VolunteerId { get; set; }
public virtual Church Church { get; set; }
public virtual Administration Admins { get; set; }
//public virtual Volunteer Volunteers { get; set; }
}
我從您的問題中了解到,您希望從任命到志願人員之間存在一對多的關系。
只需在“約會”模型中放入“志願者”的ICollection導航屬性。 這將被視為一對多關系。 就像一次任命可以有多個/許多志願者的資格
class Volunteer
{
//properties
}
class Appointments
{
//other properties
//....
//. . .
//Navigation property/foreign key for Volunteers(one-many)1 appointments=many volunteers
ICollection<Volunteer> Volunteers {get;set;}
}
您提到了一個儀式,后來不再提及。 我假設一個儀式就是您在其他地方所說的約會。
這是我從您的班級中學到的,也是我認為您已正確定義的內容。
您似乎有一些教堂。 每個教會都有零個或多個志願者,每個志願者恰好屬於一個教會。 這稱為一對多關系
每個志願者可以有零個或多個約會。
不清楚:-約會僅屬於一個志願者,還是幾個志願者可以參加同一約會? -申請人是志願者嗎? 在那種情況下:不要將志願者屬性復制到申請人-參加會議的所有志願者是否都屬於同一教會,或者會議參加者可以屬於不同的教會嗎?
在我看來,來自不同教會的人們可能參加同一會議更合乎邏輯。 這意味着每個志願人員都可以參加零個或多個會議(約會),並且每個會議都有零個或多個志願人員(可能來自不同教會)參加:這是一種真正的多對多關系。
顯然,教會與任命之間也存在關系。 目前尚不清楚是任命的教會是教堂,還是任命的地點。 無論如何,我們假設每個教堂擁有零個或多個約會,並且每個約會僅在一個教堂中舉行
如果您遵循實體框架代碼優先約定,那么下面的內容就足夠了:
class Church
{
public int Id {get; set;}
// every Church has zero or more Volunteers:
public virtual ICollection<Volunteer> Volunteers {get; set;}
// every Church hosts zero or more Appointments:
public virtual ICollection <Appointment> Appointments {get; set;}
... // other Church properties
}
class Volunteer
{
public int Id {get; set;}
// every Volunteer belongs to exactly one Church using foreign key
public int ChurchId {get; set;}
public virtual Church Church {get; set;}
// every Volunteer has zero or more Appointments:
public virtual ICollection<Appointment> Appointments {get; set;}
... // other Properties
}
class Appointment
{
public int Id {get; set;}
// every Appointment is attended by one or more Volunteers (many-to-many)
public virtual ICollection<Volunteer> Volunteers {get; set;}
// every Appointment is hosted by exactly one Church using foreign key
public int ChurchId {get; set;}
public virtual Church Church {get; set;}
... // other properties
}
class MyDbContext : DbContext
{
public DbSet<Church> Churches {get; set;}
public DbSet<Volunteer> Volunteers {get; set;}
public DbSet<Appointment> Appointments {get; set;}
}
因為我遵循實體框架約定,所以這是所有實體框架需要了解的內容,以了解我計划在教堂和志願者之間進行一對多的計划,並在志願者和任命之間進行多對多的計划。 實體框架將識別主鍵和外鍵,甚至會為您的多對多關系創建連接表 。 不需要屬性也不需要流暢的API。 僅當您想要不同的表名或列名時,才需要屬性或流利的api。
用法:
給我在聖巴塞洛繆教堂舉行的“約翰”志願人員的所有任命:
var appointmentsofJohnInStBarth = dbContext.Appointments
.Where(appointment => Appointment.Volunteer.Name = "John"
&& appointment.Church.Name = "Saint Bartholomew")
.Select(appointment => new
{
StartTime = appointment.StartTime,
EndTime = appointment.EndTime,
Description = appointment.Description,
Attendants = appointment.Volunteers
.Select(volunteer => new
{
Name = volunteer.Name,
Function = volunteer.Function,
Email = volunteer.Email,
...
})
.ToList(),
});
因為您的DbContext知道了志願者/教堂/任命之間的關系,所以DbContext知道了何時為一對多執行GroupJoin或在JunctionTable上為多對多關系執行聯接,而無需指定必須執行哪些連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.