实体框架中的模型关系

时间:2015-08-31 02:07:04

标签: c# asp.net database 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 访问工作人员分支,但我想访问在分支机构工作的所有工作人员。所以我想要像 m.Branches.Find(Id).Workers 这样的东西。它有效,但对我来说似乎很奇怪。因为worker对象已经包含了所有分支,所以分支对象也包含所有工作者。我甚至不知道我需要这个,因为我可以通过使用LINQ to Entity或原始SQL轻松获得所有在分支机构工作的工作人员。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

导航属性(Branch类中的WorkerWorkers中的Branch)是延迟加载的。从数据库中获取Worker时,它不包含其中的分支。但是,无论何时需要分支(即,当您阅读w.Branch时),延迟加载机制都会启动并从数据库中获取它。 对于Workers中的Branch也是如此。

所以,作为一个简单的答案,你正在以正确的方式做到这一点。

顺便说一下,这里有很多东西需要学习:

  • 您可以使用预先加载来通过一次调用数据库来获取所需的所有内容
  • 如果您知道代码的某些部分不需要相关数据,则可以关闭延迟加载。
  • 您可以加载一些工作人员,然后加载一些分支,EF将连接它们以防逻辑连接。在某些情况下,这可能比使用延迟加载更快。