2009-05-28 8 views
10

Spinning plus loin sur le previous question j'ai eu. Disons que j'ai hérité de BlogEntry et de Commentaire de Post. Je veux maintenant les personnaliser un peu. Un commentaire à un billet de blog n'a pas besoin d'un titre, mais un commentaire besoin d'une référence utilisateur je propose donc ces deux champs à partir de Post et en commentaires et une entrée de blog comme celui-ci:EF4 - question ObjectContext et héritage personnalisée

public abstract class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual DateTime CreatedAt { get; set; } 
} 

public class BlogEntry : Post 
{ 
    public virtual string Header { get; set; } 
    public virtual Blog Blog { get; set; } 
    public virtual IEnumerable<Comment> Comments { get; set; } 
} 

public class Comment : Post 
{ 
    public virtual string Header { get; set; } 
    public virtual int UserId { get; set; } 
    public virtual BlogEntry BlogEntry { get; set; } 
} 

Maintenant, je crée mon contexte d'objet personnalisé :

public class EntityContext : System.Data.Objects.ObjectContext 
{ 
    public EntityContext() : base("name=Entities", "Entities") 
    { 
     this.Blogs = CreateObjectSet<Blog>(); 
     this.Posts = CreateObjectSet<Post>(); 
     this.Entries = CreateObjectSet<BlogEntry>(); 
     this.Comments = CreateObjectSet<Comment>(); 
    } 
    public ObjectSet<Blog> Blogs { get; set; } 
    public ObjectSet<Post> Posts { get; set; } 
    public ObjectSet<BlogEntry> Entries { get; set; } 
    public ObjectSet<Comment> Comments { get; set; } 
} 

Cela me donne ce qui suit en fait un message d'erreur assez descriptif:

méthode d'essai a lancé exception: System.ArgumentException: Il y a no EntitySets défini pour le type d'entité spécifié 'BlogEntry' . Si 'BlogEntry' est un type dérivé, utilisez plutôt le type de base . Par exemple, vous verrait cette erreur si vous avez appelé CreateObjectSet() et DiscontinuedProduct est un type d'entité connu mais n'est pas directement mappé à un EntitySet. Le type DiscontinuedProduct peut être un type dérivé où le type parent est mappé au EntitySet ou le type DiscontinuedProduct peut ne pas être mappé à un EntitySet du tout. Nom du paramètre: TEntity

Maintenant, je ne suis pas un maître d'héritage et d'autres choses, mais la façon dont je vois cela serait d'ajouter un ensemble d'entrées et commentaires comme ObjectSet < post> qui résoudrait mes problèmes?

Répondre

11

Si vous créez un ObjectSet pour un type de base (à savoir Post) vous ne pouvez pas créer un pour les types dérivés aussi, parce que vous pouvez récupérer les instances de tous types dans la hiérarchie de l'héritage de celui-là ObjectSet.

, c'est-à-dire ctx.Posts.OfType<BlogEntry>() retournerait BlogEntry (s).

Donc la réponse est simplement de supprimer les deux autres ensembles.

Si yo besoin de faire un ajout par exemple, vous pouvez le faire:

ctx.Posts.AddObject(new BlogEntry {....}); 

aucun problème du tout.

Pour vous aider à écrire des requêtes que vous pourriez probablement plus facilement ajouter quelques propriétés à votre ObjectContext qui ressemblent à ceci:

public ObjectQuery<BlogEntity> Blogs{ 
    get{ 
     return ctx.Posts.OfType<BlogEntry>() as ObjectQuery<BlogEntry>; 
    } 
} 

et même pour les commentaires.

Hope this helps

Alex

+0

Oui, je ne l'ai pas eu le temps de regarder plus loin. Ce que vous dites semble vrai. Je viens de finir d'écrire un énorme blog sur mes découvertes aujourd'hui. On dirait que je dois en écrire un autre demain sur l'héritage POCO :) – mhenrixon

+0

Merci pour le conseil avec juste enlever le bagage! :) – mhenrixon