2010-02-16 6 views
0

Utilisation du code EF 4.0 uniquement Je souhaite faire une association entre une classe abstraite et une classe normale.EF 4.0 Affectation de code uniquement de l'abstrait au dérivé

J'ai la classe 'Item', 'ContentBase' et 'Test'. 'ContentBase' est abstrait et 'Test' en dérive. 'ContentBase' a une propriété 'Item' qui lie à une instance de 'Item'.

Pour que 'Test.Item' ou toute classe dérivée de 'ContentBase' ait une propriété de navigation 'Item'.

Dans ma base de données, chaque enregistrement de test possède un enregistrement correspondant pour l'élément.


public class Item 
{ 
    public int Id { get; set;} 
} 

public abstract class ContentBase 
{ 
    public int ContentId { get; set;} 
    public int Id { get; set;} 

    public Item Item { get; set;} 
} 

public class Test : ContentBase 
{ 
    public string Name { get; set;} 
} 

maintenant un code d'initialisation

public void SomeInitFunction() 
{ 

    var itemConfig = new EntityConfiguration<Item>(); 
    itemConfig.HasKey(p => p.Id); 
    itemConfig.Property(p => p.Id).IsIdentity(); 
    this.ContextBuilder.Configurations.Add(itemConfig); 

    var testConfig = new EntityConfiguration<Test>(); 
    testConfig.HasKey(p => p.ContentId); 
    testConfig.Property(p => p.ContentId).IsIdentity(); 

    // the problem 
    testConfig.Relationship(p => p.Item).HasConstraint((p, q) => p.Id == q.Id); 

    this.ContextBuilder.Configurations.Add(testConfig); 
} 

Cela donne une erreur: Une clé est enregistrée pour le type dérivé 'Test'. Les clés doivent être enregistrées pour le type racine "ContentBase".

de toute façon je tente d'obtenir une erreur. Que fais-je mal?

Répondre

0

Conclusion jusqu'à présent: pas possible.

0

La propriété d'élément de navigation est de définir le niveau de type de base, de sorte que le modèle est au courant du type de base - vous pouvez ajouter la propriété à la classe de test qui passent la propriété Item et carte dans votre relation:

public class Test : ContentBase 
{ 
    public string Name { get; set;} 
    public string TestItem { get {return Item;} ... 

} 

testConfig.Relationship(p => p.TestItem) 
0

Essayez dans l'entité de suppertype redéclarer votre relation:

En Contentbase: Item virtuel public Item {get; set;}

En test: public nouveau Item Item {get; set;}

Ceci a été compilé dans mon projet de test, mais je ne l'ai pas testé davantage. Juste pour l'instant, wheb EF5 ou final vient

Questions connexes