DbContext Инициализация свойств навигации ICollection, но не других - PullRequest
0 голосов
/ 26 октября 2011

Наличие

public class ClassOne
{
  [Key]
  public virtual int ClassOneID { get; set; }

  [InverseProperty("ClassOne")]
  public virtual ICollection<ClassTwo> ClassTwoCollection { get; set; }
}

public class ClassTwo
{
  [Key]
  public virtual int ClassTwoID { get; set; }

  [ForeignKey("ClassOne")]
  public virtual int ClassOneID { get; set; }

  [InverseProperty("ClassTwoCollection")]
  public virtual ClassOne ClassOne { get; set; }

  [InverseProperty("ClassTwo")]
  public virtual ICollection<ClassThree> ClassThreeCollection { get; set; }

  [InverseProperty("ClassTwo")]
  public virtual ClassFour ClassFour { get; set; }

  [InverseProperty("ClassTwoPrimary")]
  public virtual ICollection<ClassFour> ClassFourCollectionAsPrimary { get; set; }
}

public class ClassThree
{
  [Key]
  public virtual int ClassThreeID { get; set; }

  [ForeignKey("ClassTwo")]
  public virtual int ClassTwoID { get; set; }

  [InverseProperty("ClassThreeCollection")]
  public virtual ClassTwo ClassTwo { get; set; }
}

public class ClassFour
{
  [Key]
  [ForeignKey("ClassTwo")]
  public virtual int ClassTwoID { get; set; }

  [ForeignKey("ClassTwoPrimary")]
  public virtual int ClassTwoPrimaryID { get; set; }

  [InverseProperty("ClassFour")]
  public virtual ClassTwo ClassTwo { get; set; }

  [InverseProperty("ClassFourCollectionAsPrimary")]
  public virtual ClassTwo ClassTwoPrimary { get; set; }
}

Если я создаю ClassOne: myDbCntxt.ClassOneSet.Create();, ClassTwoCollection инициализируется.

Если я создаю ClassTwo: myDbCntxt.ClassTwoSet.Create();, ClassThreeCollection и ClassFourCollectionAsPrimary будут равны нулю.

Почему?

Создание прокси включено, и я вижу сгенерированное имя класса, и это прокси-классы. Я знаю, что переоценил свои свойства, но сегодня это не вопрос.

Все, что я хотел бы понять, это ПОЧЕМУ для ClassTwo свойства Collection не инициализируются при создании из DbContext.

Спасибо


UPDATE

Проблема в том, что другой член НЕ объявлен виртуальным в ClassTwo. Я предполагаю, что есть правило, что все ваши открытые члены должны быть виртуальными, чтобы свойства коллекции были инициализированы в прокси.

1 Ответ

0 голосов
/ 27 октября 2011

Обнаружена проблема.

Проблема заключалась в том, что другой член НЕ был объявлен виртуальным в ClassTwo.Я предполагаю, что есть правило, что все ваши открытые члены должны быть виртуальными, чтобы свойства коллекции были инициализированы в прокси.Что если вы не хотите, чтобы свойство Int32 вообще переопределялось в ваших прокси.Это не должно влиять на поведение по умолчанию для свойств виртуальной навигации.

...