2011-02-16 2 views
0

J'ai défini une entité appelée Variable et classes dérivées à l'aide de Table par hiérarchie (TPH). La classe de base « Variable » contient une collection de PropertyValues:EF4 CTP5 Comment? Mapper une propriété héritée à un champ d'une table associée

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

Maintenant, je veux dériver une classe SpecialVariable (ou plusieurs), qui définissent des SpecialProperties (par exemple HighLimit) qui devrait être mis en correspondance avec une entrée dans les PropertyValues ​​(table).

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

Ma fonction OnModelCreating ressemble actuellement à ceci:

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

que quelqu'un peut me donner quelques conseils sur la manière de réaliser cela, sans écrire des tonnes de mauvais code de la recherche dans la classe dérivée. (La performance est pas important.)

meilleures salutations,

Chris

Répondre

1

Vous ne pouvez pas mapper des propriétés aux dossiers. C'est ainsi que je comprends votre question. Vous avez une table PropertyValues ​​qui est probablement une paire clé/valeur et vous voulez mapper les propriétés de l'entité sous forme d'enregistrements (données) à cette table. Ce n'est pas quelque chose que EF fait pour vous. Vous devez fournir des propriétés non mappées qui fonctionneront avec l'enregistrement correct dans la collection propertyValues.

Quelque chose comme:

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

Le problème avec cette approche est que vous ne pouvez pas utiliser HighLimit dans LINQ-to-entités requêtes - vous devez toujours utiliser PropertyValues.

De plus, TPH dans EF requiert que les propriétés de l'entité dérivée (MySpecialVariable) soient mappées sur la même table que l'entité parente (Variable). Vous ne pouvez pas mapper les propriétés de l'entité dérivée dans les données stockées dans une autre table (PropertyValues).

+0

Salut Ladislav, ta réponse était ce à quoi je m'attendais et à quoi je pensais aussi, mais l'espoir meurt en dernier. Ce que je n'aime pas sur cette approche, c'est qu'il y a tellement de code pour chaque propriété. merci et meilleures salutations, chris – ChrisTTian667

Questions connexes