EF4 CTP5 Как? Сопоставить унаследованное свойство с полем в связанной таблице - PullRequest
0 голосов
/ 16 февраля 2011

Я определил сущность с именем Variable и производные классы, используя Table Per Hierarchy (TPH).Базовый класс «Variable» содержит коллекцию PropertyValues:

private ICollection<PropertyValue> propertyValues;

public const string DiscriminatorColumn = "Discriminator";
public const string Table = "Variables";

public VariableType VariableType { get; set; }
public string Name { get; set; }

[NotMapped]
public string Discriminator { get; set; }

public virtual ICollection<PropertyValue> PropertyValues
{
    get { return this.propertyValues ?? (this.propertyValues = new ObservableCollection<PropertyValue>()); }
    set { SetProperty(ref this.propertyValues, value, () => PropertyValues); }
}

Теперь я хочу получить класс SpecialVariable (или более одного), который определяет некоторые SpecialProperties (например, HighLimit), которые должны быть сопоставлены сзапись в PropertyValues ​​(таблица).

public class MySpecialVariabe : Variable
{
    public double HighLimit { get; set; }
}

Моя функция OnModelCreating в настоящее время выглядит следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Variable>().HasKey(x => new { x.Id });

    modelBuilder.Entity<Variable>()
        .Map<MySpecialVariabe>(m => m.Requires(Variable.DiscriminatorColumn).HasValue(typeof(MySpecialVariabe).Name))
        .Map<MySpecialVariabe2>(m => m.Requires(Variable.DiscriminatorColumn).HasValue(typeof(MySpecialVariabe2).Name)).ToTable(Variable.Table);
}

Может кто-нибудь дать мне несколько советов, как это реализовать, без написания тонныплохо выглядящий код в производном классе.(Производительность не так важна.)

С наилучшими пожеланиями,

Крис

1 Ответ

1 голос
/ 16 февраля 2011

Вы не можете сопоставить свойства с записями.Вот так я понимаю твой вопрос.У вас есть таблица PropertyValues, которая, скорее всего, является некоторой парой ключ / значение, и вы хотите отобразить свойства сущности как записи (данные) в эту таблицу.Это не то, что EF сделает для вас.Вы должны предоставить не сопоставленные свойства, которые будут работать с правильной записью в коллекции propertyValues.

Что-то вроде:

[NotMapped]
public double HighLimit
{
  get
  {
    var current = propertyValues.SingleOrDefault(p => p.Key == "HighLimit");
    return current != null ? current.Value : 0.0;
  }
  set 
  {
    var current = propertyValues.SingleOrDefault(p => p.Key == "HighLimit");
    if (current != null)
    {
      current.Value = value;
    }
    else
    {
      propertyValues.Add(new PropertyValue { Key = "HighLimit", Value = value });
    }
  }
}

Проблема этого подхода заключается в том, что вы не можете использовать HighLimit в Linqзапросы to-entity - вы всегда должны использовать PropertyValues.

Кроме того, TPH в EF требует, чтобы свойства производного объекта (MySpecialVariable) были сопоставлены с той же таблицей, что и родительский объект (переменная).Вы не можете отобразить свойства производного объекта в данные, хранящиеся в другой таблице (PropertyValues).

...