在实体框架中建模关系

本文关键字:建模 关系 框架 实体 | 更新日期: 2023-09-27 18:10:31

我试图建立一些基于数据库的模型,我有两个表,一个用于工人,另一个用于分支机构。每个工人在一个分支机构工作,因此每个工人只有一个分支机构,而分支机构有无限个工人。

My worker model:

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.w erers . find (Id)访问工人分支。分支,但我想访问在分支中工作的所有工人。所以我想要像m.Branches.Find(Id). workers 这样的东西。它是有效的,但我觉得很奇怪。因为一个工作对象已经有了所有的分支,分支对象也有了所有的工作对象。我甚至不知道我需要这个,因为我可以很容易地通过使用LINQ到实体或原始SQL获得在分支中工作的所有工人。

正确的做法是什么?

在实体框架中建模关系

导航属性(Worker类中的BranchBranch类中的Workers)是延迟加载的。当你从数据库中获取一个Worker时,它并不包含分支。但是,每当需要分支时(即读取w.Branch时),惰性加载机制就会启动并从数据库中获取它。对于Branch中的Workers也是如此。

所以作为一个简单的答案,你这样做是正确的。

顺便说一句,这里有很多东西要学:

  • 你可以使用急切加载来获取你需要的一切在一个单一的调用DB
  • 你可以关闭延迟加载,如果你知道你的代码的某些部分不需要相关的数据。
  • 你可以加载一些工人,然后一些分支和EF将连接他们,以防他们在逻辑上连接。在某些情况下,这可能比使用延迟加载更快。