Question

Utilisation EF 4.0 Code que je veux faire une assocation entre une classe abstraite et normale.

Je classe 'article', 'Contentbase' et 'Test'.

'Contentbase' est abstraite et 'Test' en dérive.

'Contentbase' a une propriété 'article' qui relie à une instance de 'article'.

Alors que 'Test.Item' ou toute classe qui dérive de 'Contentbase' a une propriété de navigation 'Item'.

Dans mon DB tous les records pour le test a un enregistrement correspondant à 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 init

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és pour le type racine « Contentbase ».

de toute façon j'essayer je reçois une erreur. Que suis-je fait de mal?

Était-ce utile?

La solution

Conclusion jusqu'à présent. Pas possible

Autres conseils

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

En Contentbase: virtuel Point d'objet du public {get; ensemble;}

Dans l'essai: Nouvel élément de l'article du public {get; ensemble;}

compilé dans mon projet de test, mais je n'ai pas testé davantage. Juste pour l'instant, Wheb EF5 ou comeso finale

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 la carte dans votre relation:

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

}

testConfig.Relationship(p => p.TestItem )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top