【问题标题】:Using Database first approach in Entity framework, how to fetch the data from a single table only which has multiple foreign key relationship?在实体框架中使用数据库优先方法,如何仅从具有多个外键关系的单个表中获取数据?
【发布时间】:2016-07-17 11:11:41
【问题描述】:

我在实体框架中使用数据库优先方法。我有两个表,即 Person 和 Role 表。 Person 表有 3 列

  • 人员标识
  • 姓名
  • 角色 ID

角色表有 2 列

  • 角色 ID
  • 角色名称

这两个表的自动生成的类以及外键关系如下。

public partial class Role
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Role()
    {
        this.People = new HashSet<Person>();
    }

    public int RoleId { get; set; }
    public string RoleName { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Person> People { get; set; }
}

public partial class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }

    public virtual Role Role { get; set; }
}

我使用以下代码从角色表中检索数据

    public List<Role> GetRole()
    {
        var _context= new TestDBEntities();
        List<Role> data = new List<Role>();
        data  = _context.Roles.ToList();
        return data;
    }

从 Role 表中检索数据时,Role 表中的所有数据都已检索,但 Person 表数据也随之检索。背后的原因一定是这两张表的关系。所以,我只想从 Role 表中获取数据。任何人都可以帮助我如何仅在没有来自 Person 的数据的情况下从 Role 表中获取数据?

【问题讨论】:

  • 你怎么知道 Person 列表也被加载了?
  • 我正在使用断点进行调试,所以我可以看到角色数据行中的人员列表
  • Ivan 下面回答了我为什么会发生这种情况。如果您从 ICollection 中删除 'virtual' 关键字,则在您手动加载相关对象之前不会出现。
  • 我解决了,但我不必从 ICollection 中删除“虚拟”关键字。相反,我在继承 DbContext 的 EntitiesClass 的构造函数中禁用了延迟加载。 public TestDBEntities() : base("name=TestDBEntities") { this.Configuration.LazyLoadingEnabled = false; }

标签: c# asp.net asp.net-mvc-4 entity-framework-6


【解决方案1】:

显示的代码没有检索到相关数据,但是当其他代码第一次访问People 属性时。它可能是调试器变量窗口或一些序列化代码。

这种行为称为Lazy Loading。可以通过多种方式禁用它,最简单的方法是从导航属性中删除 virtual 关键字。在 Code First 中,您可以直接在代码中执行此操作,在 EDMX 设计器中,我猜肯定有一些属性控制生成的属性访问器。或者使用Selective disabling of lazy loading with Database First method 线程中描述的技术。

【讨论】:

  • 查看断点时,我可以看到 Role 数据的行具有 Person 属性(因为 Person 和 Role 表之间的关系)并且它包含 Person 数据。所以上面提到的代码正在获取角色数据以及角色数据行中的人员数据。我会尝试你上面提到的技术并让你知道。
  • 你怎么看?在调试器中,对吗?请参阅答案的第一段。实际上,没有办法查看它是否已加载,因为一旦您“查看”属性,它就会被加载 - 这是延迟加载的副作用。
  • 感谢@Ivan 的回答。我通过在继承 DbContext 的 TestDBEntities 类的构造函数中包含 public TestDBEntities() : base("name=TestDBEntities") { this.Configuration.LazyLoadingEnabled = false; } 解决了这个问题。它对我有用。现在可以在不从外键表中检索数据的情况下获取 Person 表数据。
  • 不客气,很高兴这有助于解决问题。您选择的解决方案是我提到的“几种方式”之一,并在“延迟加载”链接的“关闭所有实体的延迟加载”部分中进行了说明。所以你选择最适合你的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2012-11-15
  • 2013-07-04
  • 2013-06-12
相关资源
最近更新 更多