实体框架未初始化的集合

时间:2010-12-24 12:40:21

标签: c# database linq entity-framework collections

鉴于以下简单的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自动初始化吗?有没有办法确保它是?

2 个答案:

答案 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'字样。如果能编译我会感到惊讶。