2012-02-12 12 views
1

私は再利用することができますどのように簡単なを見つけるためにしようとしている何かが私のアプリケーションで「commentable」で複数のシナリオのためのエンティティタイプ「コメント」 。エンティティフレームワーク4.1 - 複数のテーブルにエンティティを分離(コード・ファースト)

現時点では、ユーザーがコメントを投稿できるエンティティが2つあります。例には、ブログ、プロフィール、写真などがあります。これらはすべて「コメント」できます。

私は、これらのシナリオのそれぞれに対して同じ「コメント」クラスを使用できるようにしたいと思いますが、私はすべてのコメントを完全に一つの巨大なテーブルで終わるしたくありません。私は、BlogComments、PhotoComments、ProfileCommentsのテーブルを少なくとも保存する方がはるかに効率的だと考えています。現時点では、私のコメントのクラスは、次のようになります。

public class Comment 
{ 
    [Key] 
    public int Id { get; set; } 

    public int ContextId { get; set; } 

    [StringLength(256)] 
    public string Content { get; set; } 

    public DateTime DatePosted { get; set; } 

    public virtual Member Author { get; set; } 
} 

おそらく、私がコメントされている特定のものを参照するために「CONTEXTID」フィールドを必要とするだろう。このIDはブログ、プロフィール、写真のIDです。私は、これらのクラスの通常いるICollectionのような多くのコメントを参照することができるように期待していた、と私は例として、写真のため、このようないくつかのコードを持っている:

public class Photo 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(48)] 
    public string FileName { get; set; } 

    public virtual Member Owner { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
} 

私は私の中に様々な記事を指摘してきました私の特定の状況には関係ないようです。これらのコメントコレクションを別のテーブルにマップするにはどうしたらいいですか?「スーパーテーブル」というコメントは避けてください。

すべてのヘルプは、ポインタまたはアドバイスは非常に高く評価されるだろう:)

答えて

1

あなたは抽象Commentクラスを作成し、それから、そのようなPhotoCommentProfileCommentなどの特定のコメントを継承することができます。コメントを別のテーブルにマップすることができます。

public abstract class Comment 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(256)] 
    public string Content { get; set; } 

    public DateTime DatePosted { get; set; } 

    public virtual Member Author { get; set; } 
} 


public class PhotoComment : Comment 
{ 
    public int PhotoId { get; set; } 

    public virtual Photo Photo { get; set; } 
} 


public class Photo 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(48)] 
    public string FileName { get; set; } 

    public virtual Member Owner { get; set; } 

    public virtual ICollection<PhotoComment> Comments { get; set; } 
} 
+0

ブリリアント!それは本当にいい、シンプルな解決策です。私は非常に多くの問題を複雑にしていた - ありがとう:) – Alex

関連する問題