2016-05-15 4 views
1

私はエンティティフレームワークの新機能であり、データベースアーキテクチャの専門家ではありません。私が持っています。Entity Framework - 同じクラスタイプのアイテムのリストを複数のクラスに持たせることができます

私は、ジョーク、イメージ、ストーリー、漫画のような様々なエンティティを持っていると言います。彼らはすべて異なるデータを持っていますが、彼らはすべてがIDを持っているという事実を共有しています。私の場合、Guid。

コメントだけを格納するコメント、コメントを投稿したユーザー、アイテムのIDをコメントとして格納したいエンティティがあります。これは上記のいずれのタイプでもかまいません。私は、JokeCommentsテーブル、ImageComments、StoryCommentsなどを作成する必要はありません。非効率的なように - コメント可能なアイテムごとに多くのクラスを維持する必要があるため、すべてのコメントを簡単に取得できません。単一のユーザー。

だから私はこの

public abstract class IdentifiableObject 
{ 
    public IdentifiableObject() 
    { 
     Id = Guid.NewGuid(); 
    } 

    public Guid Id { get; set; } 
} 

public class Joke: IdentifiableObject 
{ 
    public List<Comment> Comments {get; set;} 
} 

public class Story : IdentifiableObject 
{ 
    public List<Comment> Comments {get; set;} 
} 

public class Comment 
{ 
    public Guid Id {get; set;} 
    public String Comment {get; set;} 
    [Key, ForeignKey ("IdentifiableObject")] 
    public Guid TargetId {get; set;} 
} 

のようなものを持っている。しかし、これは動作しません、と私はどこグーグルを開始するためには考えています。私はInterfacesの使用について読んだことがありますが、この状況でどのように動作するのかは分かりません。 Commentクラスに 'TargetType'プロパティを追加する必要がありますか?もしそうなら、そのタイプは何でしょうか?私がCommentクラスにキーを残しておけば、それは連合できるすべてのタイプのFKを作成するので、ターゲットを取得する方法を知っているという問題が残っています。

EntityFrameworkでこの要件に近づく方法を教えてもらえますか、私がしようとしている名前がGoogleの正しい方向に向くよう助けてくれることを教えてください。ありがとう..

+1

これは[些細ではない](http://stackoverflow.com/q/13953675/861716)です。 –

答えて

1

あなたの質問はすばらしい、または直接答えではありませんが、あなたはcommentsプロパティで基本クラスを作成することができます。

public abstract class CommentedObject 
{ 
    public List<Comment> Comments {get; set;} 

public class Joke: CommentedObject 
{ 
} 

public class Story : CommentedObject 
{ 
} 

public class Comment 
{ 
    public Guid Id {get; set;} 
    public String Comment {get; set;} 
    [Key, ForeignKey ("IdentifiableObject")] 
    public Guid TargetId {get; set;} 
} 

問題を解決するために継承が必要であるという点で、厄介ですが、機能します。

EF table per hierarchytable per typeの戦略についてお読みください。

+0

スティーブに感謝 - これは行く方法です。 TablePerTypeを使用して、すべての関連型の基本クラス。 EFがそのパターンを理解するように見えます。 – Toby

関連する問題