2009-05-28 12 views
10

私はprevious questionでさらに回転しています。 BlogEntryと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; } 
} 

今、私は私のカスタムオブジェクトコンテキストを作成します:

試験方法が例外を投げた: System.ArgumentExceptionの:があり

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

これは私の次は実際には非常にわかりやすいエラーメッセージを表示します指定されたエンティティタイプ 'BlogEntry'の に定義されているエンティティセットがありません。 'BlogEntry'が派生型の場合は、代わりに 基本型を使用してください。たとえば、 CreateObjectSet() を呼び出し、DiscontinuedProductが既知の エンティティタイプですが、 をEntitySetに直接マップしていない場合、 にこのエラーが表示されます。 DiscontinuedProductタイプは、親タイプが がEntitySetにマッピングされているか、または DiscontinuedProductタイプが でEntitySetにまったくマッピングされていない 派生タイプである可能性があります。 パラメータ名:TEntity今

I午前ない相続とスタッフが、私は、これは私の問題を解決するだろうobjectSetと<ポスト>としてエントリーとコメントのセットを追加することです見る方法のマスター?

答えて

11

あなたは基本型(すなわちPost)のためObjectSetを作成する場合は、その1 ObjectSetから継承階層内のすべてのタイプのインスタンスを取得することができますので、あなたは、あまりにも派生型のための1つを作成することはできません。

つまりctx.Posts.OfType<BlogEntry>()はBlogEntryを返します。

答えは、単に他の2つのセットを削除することです。

ヨーヨーはあなたがこれを行うことができ、たとえば追加する必要がある場合は、次のすべての

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

問題ありませんが。コメントを

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

と同じ:あなたは、おそらく次のようになり、あなたのObjectContextにプロパティのカップルを追加することができ、より簡単にクエリを書くため

希望これは、うん、私はさらにそれを見て時間がなかった

アレックス

+0

に役立ちます。あなたの言うことは真実です。私はちょうど私の発見についての巨大なブログ記事を今日書くのを終えました。私は明日別のPOCO継承について書く必要があるように見えます:) – mhenrixon

+0

ちょうどバゲージを取り除くとチップのおかげで! :) – mhenrixon

関連する問題