Почему мои навигационные свойства имеют нулевое значение при получении из базы данных в EF 4.2 POCO? - PullRequest
0 голосов
/ 27 января 2012

У меня чрезвычайно упрощенная модель данных (ниже). У меня возникают проблемы с выяснением того, как мне получить навигационные свойства для загрузки из базы данных. У меня нет проблем с их вводом, но EF не устанавливает свойства навигации. Я видел несколько связанных вопросов, но они немного отличаются или скорее связаны. Я ищу информацию о том, как навигационные свойства обрабатываются EF 4.2 (POCO). В прочитанном мною чтении сложилось впечатление, что я смогу получить доступ к объектам с помощью внешних ключей с помощью навигационных свойств. Вместо этого мои свойства возвращаются как нулевые или пустые в зависимости от того, создаю ли я экземпляр своей коллекции в конструкторе.

public class AnimalDb : DbContext
{
    public static AnimalDb Create(string fileName)
    {
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
        return new AnimalDb(fileName);
    }

    private AnimalDb(string fileName) : base(fileName) { }

    public DbSet<Animal> Animals { get; set; }
}

public class Animal
{
    public Animal()
    {
        Id = Guid.NewGuid();
        Traits = new ObservableCollection<Trait>();
    }

    public Guid Id { get; set; }
    public string Species { get; set; }
    public string Name { get; set; }
    public ObservableCollection<Trait> Traits { get; set; }
}

public class Trait
{
    public Trait()
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }
    public string Name { get; set; }
}

А вот некоторый (простой) код, который его использует:

foreach (var animal in db.Animals)
{
    foreach (var trait in animal.Traits)
    {
        //animal.Traits count is 0, so this does not run.
        //However there are traits in the database, as my populate
        //function is working fine.
        Console.WriteLine("{0} is {1}", animal.Name, trait.Name);
    }
}

---- Редактировать резюме ответа ----

Используя статью и информацию, представленную в ответах ниже, я смог обнаружить, что могу либо охотно загружаться с помощью db.Animals.Include (), либо включить отложенную загрузку. Есть хитрость в том, чтобы включить отложенную загрузку и использовать ее. Сначала для включения отложенной загрузки я добавил:

db.Configuration.LazyLoadingEnabled = true;

Далее я изменил свою коллекцию Черт следующим образом:

public virtual ObservableCollection<Trait> Traits { get; set; }

Делая его виртуальным, автоматически генерируемый прокси может лениво загружать Черты. Это оно! ИМХО Я думаю, что документы MSDN должны кричать об этой загрузке и очистить в соглашениях о кодировании POCO EF 4.2. Еще раз спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Существует несколько причин, по которым ваши методы подключения могут не содержать данных.Чтобы загрузить связанные данные, вам необходимо:

  • explicity загрузить данные
  • , удовлетворяющие требованиям отложенной загрузки, или
  • использовать готовую загрузку, используя Include()

Полагаю, вы отключили виртуальные прокси.Подробнее о требованиях здесь:

http://msdn.microsoft.com/en-us/library/dd456855.aspx

2 голосов
/ 27 января 2012

Если вы не используете отложенную загрузку, вы должны явно указать EF для загрузки отношения с помощью метода Включить :

foreach (var animal in db.Animals.Include(a => a.Traits))
{
    foreach (var trait in animal.Traits)
    {
        //...
    }
}

Подробнее об активной загрузке можно прочитать в1006 * эта статья .

...