繁体   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