簡體   English   中英

一個實體的多個外鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM