在Entity框架中使用Database first方法,如何从只有多个外键关系的单个表中获取数据?

时间:2016-07-17 11:11:42

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

我在Entity框架中使用Database first方法。我有两个表,即人员和角色表。 人员表有3列

  • PERSONID
  • 名称
  • 角色ID

角色表有2列

  • 角色ID
  • ROLENAME

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

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; }
}

我使用以下代码从Role表

中检索数据
    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表中获取数据吗?

1 个答案:

答案 0 :(得分:3)

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

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