【问题标题】:Entity Framework Uninitialised Collection实体框架未初始化集合
【发布时间】:2010-12-24 12:40:20
【问题描述】:

给出以下简单的 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 属性为空。这不应该由EF自动初始化吗?有没有办法确保它是?

【问题讨论】:

  • 检查有什么问题:(db.Packets != null)?
  • 我也有同样的问题。鉴于我们正在调用 .Create() 我不明白为什么 EF 不为集合创建代理。创建我们自己的集合实例感觉很笨拙,这与加载的实体不同(并且不会有任何跟踪):(

标签: c# database linq entity-framework collections


【解决方案1】:

它为空,因为您没有要求 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,而不是两次调用 - 这是延迟加载的情况。

这能回答你的问题吗?

【讨论】:

    【解决方案2】:

    您为什么不在构造函数中对其进行初始化...然后您可以确定每次使用该类的新实例时,该字段已被初始化并可以使用。

    PS:我不喜欢一行中的两个“Reciever Reciever”字样。如果它会编译,我会感到惊讶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2014-01-29
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多