【问题标题】:Navigation Properties Null until DbSet is called导航属性 Null,直到调用 DbSet
【发布时间】:2018-09-09 02:25:04
【问题描述】:

设置

我正在使用 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 地址,“英里”对象中的地址值将设置为正确的值。

发生了什么事? Entity 何时真正设置导航属性?我是否应该像填充数据一样调用其他表?后台有什么懒惰的事情需要我改变吗?

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    糟糕,我似乎只是在 Google 上搜索了几下...

    看起来我应该一直使用 .Include 扩展,因为我像这样加载 DbSet:

    public PeopleController(SmallGroupsSiteContext context)
    {
        _context = context;
    
        Person miles = context.Person.Include(person => person.Address).First();
        Debug.Print(miles.Address.ToString());
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多