2009-05-28 82 views
10

進一步旋轉previous question我有。比方說,我繼承了BlogEntry和Post from Post。我現在想要定製它們。以博客文章的註釋並不需要一個冠軍,但評論需要用戶參考,所以我出從後進入評論移動這兩個領域和博客條目是這樣的:EF4 - 自定義ObjectContext和繼承問題

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

現在我創造我的自定義對象上下文:

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

這給了我其實是相當以下描述性錯誤消息:

試驗方法拋出異常: System.ArgumentException:有 沒有爲 指定的實體類型「BlogEntry」定義EntitySets。如果 'BlogEntry'是派生類型,則改爲使用 基本類型。例如,如果您調用 CreateObjectSet() ,並且DiscontinuedProduct是已知的 實體類型,但您沒有將 直接映射到EntitySet,則您會發現此錯誤。 DiscontinuedProduct類型可能是 派生類型,其中父類型爲 映射到EntitySet或 DiscontinuedProduct類型可能根本不是 映射到EntitySet。 參數名:TEntity

現在我沒有繼承和東西,但我認爲這將是一組參賽作品和評論的添加爲對象集<郵報>,將解決我的問題的方式的高手?

回答

11

如果爲基本類型(即Post)你不能創建一個派生類型太多,因爲你可以從一個ObjectSet繼承層次檢索所有類型的實例創建ObjectSet

ctx.Posts.OfType<BlogEntry>()將返回BlogEntry(s)。

所以答案是簡單地刪除其他兩組。

如果喲需要做的加載,例如,你可以這樣做:

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

一點問題都沒有。

爲了幫助你編寫查詢更方便你很可能添加一些屬性到您的ObjectContext看起來像這樣的:

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

和相同徵求意見。

希望這有助於

亞歷

+0

是啊,我還沒來得及看它進一步。你說的話聽起來不錯。我剛寫完一篇關於我今天發現的博客文章。看起來我不得不在明天再寫一篇關於POCO繼承的文章:) – mhenrixon 2009-05-28 22:57:22

+0

感謝剛剛刪除小包的提示! :) – mhenrixon 2009-05-29 01:20:41