EF 4.0 Code que assocation de l'abstrait au dérivé
-
20-09-2019 - |
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?
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 )