EF Property, указывающий на члена внутри члена - PullRequest
1 голос
/ 28 июля 2011

Контекст: Я пытаюсь использовать один и тот же набор моделей для десериализации XML и сохранения данных EF 4.1. Я не могу изменить ни существующую XSD, ни схему базы данных.

Проблема: Структура XML не очень хорошо согласуется со структурой таблицы для нескольких моделей. В настоящее время отношение «один ко многим» базы данных определяется в (на основе XML) моделях как трехуровневая иерархия parent-child-child. Это вызывает ошибку:

Выражение 't => t.PhysicalDetails.PhysicalFeatures' не является допустимым выражением свойства.

Участник

class Participant {
  public PhysicalDetailsType PhysicalDetails { get; set; }
}

PhysicalDetailsType

class PhysicalDetailsType {
  [XmlArray("PersonPhysicalFeature")]
  public List<PhysicalFeatureType> PhysicalFeatures { get; set; }
}

PhysicalFeatureType

class PhysicalFeatureType {
  public int CaseSk { get; set; }
  public int ParticipantSk { get; set; }
  public Participant participant { get; set; }
}

Отображение EF PhysicalFeatureTypeType

class PhysicalFeatureMap : EntityTypeConfiguration<PhysicalFeatureType> {
  HasRequired(t => t.Participant)
    .WithMany(t => t.PhysicalDetails.PhysicalFeatures)
    .HasForeignKey(d => new { d.CaseSk, d.ParticipantSk});
}

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Все, что я до сих пор придумал, - это создание прокси-свойства, которое просто скрывает вложенность:

Участник

class Participant {
  public PhysicalDetailsType PhysicalDetails { get; set; }
  public List<PhysicalFeatureType> PhysicalFeatures {
    get { return PhysicalDetails.PhysicalFeatures; }
    set { Physicaldetails.PhysicalFeatures = value; }
  }
}

Кажется, до сих пор работает.

0 голосов
/ 28 июля 2011

Выражение во всех методах отображения (HasRequired, WithMany и т. Д.) Должно указывать свойство, которое объявлено для универсального типа метода (лямбда-переменная t, которая имеет тип Participant в вашем примере). Participant не имеет свойства PhysicalDetails.PhysicalFeatures. Так сказать, выражение не может содержать более одной точки.

Если я правильно понимаю, у вас есть только две таблицы в БД (для Participant и PhysicalFeatureType), но три класса в вашей модели (с дополнительными PhysicalDetailsType между). PhysicalDetailsType - это «промежуточный» тип, необходимый для отношения «один ко многим» в модели, но не существующий как таблица в базе данных, верно? (Просто чтобы понять, не то чтобы у меня была идея, как отобразить это или, если это вообще возможно.)

...