我正在进入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值将设置为正确的值。
这是怎么回事?实体何时实际设置导航属性?我是否应该像填充数据那样调用其他表?我需要更改后台发生的一些偷懒事件吗?
答案 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());
}