【问题标题】:Model relations in Entity Framework实体框架中的模型关系
【发布时间】:2015-08-31 02:07:04
【问题描述】:

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

我的工人模型:

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 这样的东西。它有效,但对我来说似乎很奇怪。因为一个工作对象已经有所有的分支,分支对象也有所有的工作人员。我什至不知道我需要这个,因为我可以通过使用 LINQ to Entity 或原始 SQL 轻松获得在分支中工作的所有工作人员。

正确的做法是什么?

【问题讨论】:

  • “正确”的方式取决于您的需求。您配置它的方式是“正确”的方式;但你可以通过其他方式做到这一点。您只能通过 Branch 访问 Workers,反之亦然;为此,您将从一个或其他类中删除您的导航属性。

标签: c# asp.net database entity-framework


【解决方案1】:

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

所以作为一个简单的答案,你做对了。

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

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

【讨论】:

  • 那很好,我现在不担心性能,因为不会有很多记录。如果这是一种有效的方法,我会使用它,因为它很容易使用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多