0

我使用 Table Per Hierarchy (TPH) 定义了一个名为变量和派生类的实体。基类“变量”包含一组 PropertyValue:

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 类(或多个),它定义了一些应该映射到 PropertyValues(表)中的条目的 SpecialProperties(例如 HighLimit)。

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);
}

有人可以给我一些提示如何实现这一点,而无需在派生类中编写大量难看的代码。(性能并不那么重要。)

最好的祝福,

克里斯

4

1 回答 1

1

您不能将属性映射到记录。我就是这样理解你的问题的。您有一些 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 });
    }
  }
}

这种方法的问题是您不能在 Linq-to-entities 查询中使用 HighLimit - 您必须始终使用 PropertyValues。

此外,EF 中的 TPH 要求派生实体 (MySpecialVariable) 的属性映射到与父实体 (Variable) 相同的表。您不能将派生实体的属性映射到存储在其他表 (PropertyValues) 中的数据。

于 2011-02-16T14:53:29.860 回答