鉴于以下简单的EF示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
namespace EFPlay
{
public class Packet
{
public Guid Id { get; set; }
public string Name { get; set; }
public Reciever Reciever { get; set; }
}
public class Reciever
{
public Guid Id { get; set; }
public virtual ICollection<Packet> Packets { get; set; }
}
public class Context : DbContext
{
public DbSet<Reciever> Recievers { get; set; }
public DbSet<Packet> Packets { get; set; }
}
public class Program
{
static void Main(string[] args)
{
var db = new Context();
var reciever = db.Recievers.Create();
}
}
}
此时reciever.Packets属性为null。这不应该由EF自动初始化吗?有没有办法确保它是?
答案 0 :(得分:1)
它是null,因为您没有要求Entity Framework检索关联。
有两种方法可以做到这一点:
1 - 延迟加载
var reciever = db.Recievers.SingleOrDefault();
var receiverPackets = receiver.Packets; // lazy call to DB - will now be initialized
我不喜欢这种方法,我个人关闭延迟加载,并使用其他方法
2 - 渴望加载
var receiver = db.Receivers.Include("Packets").SingleOrDefault();
这导致接收者和数据包之间的LEFT OUTER JOIN,而不是两次调用 - 这是延迟加载的情况。
这会回答你的问题吗?
答案 1 :(得分:0)
为什么不在构造函数中初始化它...然后你可以确定每次使用该类的新实例时,该字段已经初始化并且可以使用了。
PS:我不喜欢一行中的两个'Reciever Reciever'字样。如果能编译我会感到惊讶。