2009-05-28 12 views
10

Spinning weiter auf der previous question Ich hatte. Angenommen, ich erwerbe BlogEntry und Comment from Post. Ich möchte sie jetzt ein wenig anpassen. Ein Kommentar zu einem Blog-Post braucht keinen Titel, aber ein Kommentar braucht ein Benutzer Referenz so dass ich diese beiden Felder aus Post und in Kommentar und Blog-Eintrag wie folgt bewegen:EF4 - benutzerdefinierte ObjectContext und Vererbungsfrage

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; } 
} 

Jetzt erstelle ich meine benutzerdefinierten Objektkontext :

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; } 
} 

das gibt mir Nachricht folgendes eigentlich recht beschreibend Fehler:

Prüfnorm warf Ausnahme: System.ArgumentException: Es gibt keine EntitySets für den angegebenen Entitätstyp "BlogEntry" für den angegebenen Entitätstyp definiert. Wenn "BlogEntry" ein abgeleiteter Typ ist, verwenden Sie stattdessen den Basistyp . Zum Beispiel, Sie würde diesen Fehler sehen, wenn Sie CreateObjectSet() aufgerufen und DiscontinuedProduct ist ein bekanntes Entitätstyp ist aber nicht direkt zu einem EntitySet abgebildet. Der DiscontinuedProduct-Typ kann ein abgeleiteter Typ sein, wobei der übergeordnete Typ dem EntitySet zugeordnet ist oder der DiscontinuedProduct-Typ möglicherweise nicht einem EntitySet zugeordnet ist. Parametername: TEntity

Jetzt ist ich nicht ein Meister der Vererbung und Sachen, aber die Art, wie ich das sehen würde eine Reihe von Einträgen und Kommentaren als ObjectSet < Beitrag hinzufügen>, die meine Probleme lösen würden?

Antwort

11

Wenn Sie eine ObjectSet für einen Basistyp zu erstellen (das heißt Post) Sie können nicht erstellen ein auch für abgeleitete Typen, da Sie Instanzen aller Art in der Vererbungshierarchie von diesem einen ObjectSet abrufen können.

, d.h. ctx.Posts.OfType<BlogEntry>() würde BlogEntry (s) zurückgeben.

Also die Antwort ist einfach die anderen beiden Sätze zu entfernen.

Wenn yo benötigt ein Add zum Beispiel zu tun, dies zu tun:

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

kein Problem.

Damit Sie Abfragen leichter schreiben Sie wahrscheinlich ein paar Objekte zu Ihren Object die wie folgt aussehen könnte hinzufügen:

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

und der gleichen.

this helps

Alex

+0

Ja, ich habe keine Zeit gehabt, weiter um es zu betrachten. Was du sagst, klingt wahr. Ich habe gerade einen riesigen Blogbeitrag über meine Ergebnisse geschrieben. Sieht so aus, als müsste ich morgen noch eine weitere über POCO Vererbung schreiben :) – mhenrixon

+0

Danke für den Tipp mit nur dem Entfernen der Tasche! :) – mhenrixon