Неинициализированная коллекция Entity Framework - PullRequest
0 голосов
/ 24 декабря 2010

Учитывая следующий тривиальный пример 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 ]

1 голос
/ 25 декабря 2010

Это ноль, потому что вы не просили 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();

, что приводит к ЛЕВОМ ВНЕШНЕМУ СОЕДИНЕНИЮ между получателямиПакеты, вместо двух вызовов - как в случае с отложенной загрузкой.

Это отвечает на ваш вопрос?

0 голосов
/ 24 декабря 2010

Почему бы вам не инициализировать его в конструкторе ... Тогда вы можете быть уверены, что каждый раз, когда вы используете новый экземпляр этого класса, это поле уже инициализировано и готово к использованию.

PS: мне не нравятся два слова «Reciever Reciever» в одном ряду. Я был бы удивлен, если бы это скомпилировано.

...