簡體   English   中英

實體框架中的模型關系

[英]Model relations in Entity Framework

我試圖基於數據庫構建一些模型,我有兩個表,一個表用於工作人員,另一個表用於分支。 每個工人都在分支機構工作,因此每個工人只有一個分支機構,而分支機構則有無限的工人。

我的工人模型:

public class Worker
{
    public Worker()
    {
        Overhours = new List<Overhour>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public decimal WorkerId { get; set; }
    public decimal BranchId { get; set; }
    .....
    public virtual Branch Branch { get; set; }
    .....
}

分行:

public class Branch
{
    public Branch()
    {
        Workers = new List<Worker>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public decimal BranchId { get; set; }
    [Required(AllowEmptyStrings = false, ErrorMessage = "Bir şube adı girmelisiniz.")]
    public string BranchName { get; set; }
    public virtual ICollection<Worker> Workers { get; set; }
}

這是問題所在,我可以使用m.Workers.Find(Id).Branch訪問worker分支,但是我想訪問在分支中工作的所有worker。 所以我想要像m.Branches.Find(Id).Workers這樣的東西。 它有效,但對我來說似乎很奇怪。 因為一個工作程序對象已經在其中所有分支,所以分支對象也有所有工作程序。 我什至不知道我需要這個,因為我可以通過使用LINQ to Entity或raw SQL輕松獲取所有在分支中工作的工人。

什么是正確的方法?

導航屬性( Worker類中的BranchBranch中的Workers )是延遲加載的。 當您從數據庫中獲取一個Worker時,它不包含分支。 但是,每當需要分支時(即,當您讀取w.Branch ),惰性加載機制就會啟動並從數據庫中獲取它。 Branch Workers也是如此。

因此,作為一個簡單的答案,您正在使用正確的方法。

順便說一句,這里有很多東西要學習:

  • 您可以使用緊急加載在一次對數據庫的調用中獲取所需的一切
  • 您可以關閉延遲加載,如果您知道不需要相關數據,則可以關閉代碼的某些部分。
  • 您可以加載一些工作程序,然后某些分支和EF將在邏輯連接的情況下將它們連接起來。 在某些情況下,這可能比使用延遲加載更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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