2009-02-12 3 views
1

Je commence avec Entity Framework et ont le problème suivant:Entity Framework - L'héritage

J'ai un site entité qui contient une propriété de navigation Paragraphes.

je plusieurs entités (à savoir ImageParagraph, LinkListParagraph) qui doivent être héritées forme Paragraphe.

Je voudrais interroger un site objet et accéder à ses paragraphes et travailler avec eux en fonction de leur type de béton (à savoir de ImageParagraph, LinkListParagraph).

Cela fonctionnerait avec une approche Table par Hiérarchie (avec des conditions), mais alors je finirais dans une solution très sale. L'interrogation du type concret basé sur l'ID de paragraphe fonctionnerait, mais j'espère qu'il y a une meilleure solution.

Je veux interroger pour un site et afficher des données spécifiques du site et les données dans les paragraphes (ImageParagraph, LinkListParagraph). Je ne sais pas comment mettre en place la mise en correspondance d'une manière qu'il est possible de récupérer ImageParagraph, LinkListParagraph directement objets sur la propriété de navigation Paragraphes.

Comment pourriez-vous résoudre ce problème?

ER-diagramme: http://img443.imageshack.us/img443/46/69863714ks0.jpg

alt text http://img443.imageshack.us/img443/46/69863714ks0.jpg

Répondre

2

Si vous voulez travailler avec eux à base de leur type de béton - qui sonne comme un cas pour le polymorphisme ... pouvez-vous (dans une classe partielle) ajouter quelques méthodes?

partial class Paragraph { 
    public abstract void Foo(); 
} 
partial class ImageParagraph { 
    public override void Foo() {/*code*/} 
} 
partial class LinkListParagraph { 
    public override void Foo() {/*code*/} 
} 

Sinon, si vous voulez filtrer l'ensemble, vous pouvez utiliser la méthode d'extension OfType - à savoir

foreach(var imgPara in obj.Paragraphs.OfType<ImageParagraph>()) 
{ ... } 

Peut-être que vous pourriez ajouter des propriétés au-dessus de trop (dans l'objet parent) - à savoir

partial class Site { 
    public IQueryable<ImageParagraph> ImageParagraphs 
    { get {return Paragraphs.OfType<ImageParagraph>(); }} 

    public IQueryable<LinkListParagraph> LinkListParagraphs 
    { get {return Paragraphs.OfType<LinkListParagraph>(); }} 
} 
+0

question Thanks.My était unclear.I veulent faire. site var = context.Site.Include (les "paragraphes") Où (c => c.SiteID == 1) .Premier(); foreach (var paragraphe dans site.Paragraphs) {faire quelque chose}; Mon problème est que je ne connais pas le mapping dans l'EDM (comme avec Table par Hiérarchie avec les conditions) – chbu