在实体框架中使用数据库优先方法,如何仅从具有多个外键关系的单个表中获取数据

本文关键字:关系 数据 获取 单个表 何仅 框架 实体 数据库 方法 | 更新日期: 2023-09-27 17:57:12

>我在实体框架中使用数据库优先方法。我有两个表,即人员和角色表。人员表有 3 列

  • 人物身份
  • 名字
  • 角色标识

角色表有 2 列

  • 角色标识
  • 角色名称

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

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;
    }
从角色表中检索数据

时,检索了角色表中的所有数据,但也检索了 Person 表数据。其背后的原因一定是这两个表之间的关系。因此,我只想从角色表中获取数据。任何人都可以帮助我如何仅从角色表中获取数据而没有来自 Person 的数据?

在实体框架中使用数据库优先方法,如何仅从具有多个外键关系的单个表中获取数据

所示代码不会检索相关数据,而是在其他代码首次访问People属性时检索。它可以是调试器变量窗口或某些序列化代码。

此行为称为延迟加载。可以通过多种方式禁用它,最简单的是从导航属性中删除 virtual 关键字。在 Code First 中,您将直接在代码中执行此操作,在 EDMX 设计器中,我想必须有一些属性控制生成的属性访问器。或者使用选择性禁用使用数据库优先方法线程的延迟加载中所述的技术。