导航属性为空,直到调用DbSet

时间:2018-09-08 18:20:02

标签: entity-framework-core

设置

我正在进入Entity Framework Core(2.1),但在处理建立的关系时遇到了麻烦。为简单起见,我在人与地址表之间建立了简单的一对一关系:

public class Person
{
    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }

    public PersonAddress Address { get; set; }
}

public class PersonAddress
{
    public int ID { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public int ZipCode { get; set; }

    public int PersonID { get; set; }
    public virtual Person Person { get; set; }
}

在两者之间建立一个简单的显式链接(以确保这不是事物之间如何连接的问题):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasOne(p => p.Address)
        .WithOne(a => a.Person);

    modelBuilder.Entity<PersonAddress>()
        .HasOne(a => a.Person)
        .WithOne(p => p.Address);
}

这是我的问题

该项目是在asp.net核心应用程序中设置的,我在“ PeopleController”构造函数的末尾设置了一个断点。我还添加了一行代码,以将第一人称从DbSet中移出并将其分配给变量:

public PeopleController(SmallGroupsSiteContext context)
{
    _context = context;

    Person miles = context.Person.First();
    Debug.Print(miles.Address.ToString());
}

当我查看本地人并查看变量“ miles”时,其地址字段的值为Null。此外,如果我要在即时窗口中调用DbSet地址,则“ miles”对象中的Address值将设置为正确的值。

这是怎么回事?实体何时实际设置导航属性?我是否应该像填充数据那样调用其他表?我需要更改后台发生的一些偷懒事件吗?

1 个答案:

答案 0 :(得分:1)

糟糕,看来我离Google仅有几步搜索了...

在加载DbSet时,我似乎应该一直使用.include扩展名:

public PeopleController(SmallGroupsSiteContext context)
{
    _context = context;

    Person miles = context.Person.Include(person => person.Address).First();
    Debug.Print(miles.Address.ToString());
}