У меня чрезвычайно упрощенная модель данных (ниже). У меня возникают проблемы с выяснением того, как мне получить навигационные свойства для загрузки из базы данных. У меня нет проблем с их вводом, но 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. Еще раз спасибо за помощь.