1

EF 4.1 では、タグごとにすべてのエンティティ、またはエンティティごとにすべてのタグを照会できる、ある種のタグ付けシステムを構築する必要があります。これが私のモデルの簡略化されたスナップショットです。

public abstract class BaseEntity {

    [Required]
    [Key]
    public Guid ID { get; set; }
}

public class Tag : BaseEntity {
    // tag subscribers
    public List<King> Kings { get; set; }
    public List<Knight> Knights { get; set; }
    public List<Peasant> Peasants { get; set; }
}

public class King : BaseEntity {
    public string Title { get; set; }
    public List<Tag> Tags { get; set; }
}

public class Knight : BaseEntity {
    public string Title { get; set; }
    public List<Tag> Tags { get; set; }
}

public class Peasant : BaseEntity {
    public string Title { get; set; }
    public List<Tag> Tags { get; set; }
}

(ええ、ここではキング、ナイト、ペザントが同じであることは知っています。しかし、メッセンジャーがモンティ・パイソン・アンド・ホーリー・グレイルで言っているように、「それは単なるモデルです.」)

とにかく、このモデルはうまく機能しますが、私は特定のキャストよりも T ジェネリック リストを好みます。データベース内のテーブルが少なくなり、タグからエンティティにクエリを実行する際のオーバーヘッドが少なくなります。Tag 内のすべての List<Entity> プロパティを、T : BaseEntity である単一の汎用 List<T> に変換するにはどうすればよいでしょうか。これにより、特定の派生物に対してクエリを実行できる単一のルックアップ テーブルが生成されますか? 何かのようなもの:

 List<Knight> knightsByTag = Tags.Where(t => t.GetType() == typeof (Knight)).ToList();

編集:はい。申し訳ありませんが、実際のコードの一部がまだそこにありました。

@ダース・ベイダー:

  • 現在 3 つのリスト プロパティの代わりに 1 つのリスト プロパティを使用するタグを希望します。
  • 騎士に関連付けられたすべてのタグ、またはタグに関連付けられたすべての農民などを照会できるようにしたいと考えています。
  • できればルックアップ テーブルを使用して、EF CodeFirst がジェネリック リストを正確に解決できるようにしたいと考えています。
4

1 に答える 1

1

単一のリストがBaseEntity必要な場合は、リストを子エンティティにドロップする必要もあります。あなたは次のようなもので終わります:

public abstract class BaseEntity {
    ...

    // tags
    public List<Tag> Tags { get; set; }
}

public class Tag : BaseEntity {
    ...

    // tag subscribers
    public List<BaseEntity> Entities { get; set; }
}

特定の制約がある場合は、エンティティとタグの間の関係を作成する前に、アプリケーションでそれらを確認する必要があります。他の方法では、エンティティごとにナビゲーション プロパティを分離し、そのような関係ごとにジャンクション テーブルを分離することになります。

騎士に関連付けられたすべてのタグ - これは機能するはずです:

var tags = from k in context.Knights // or context.BaseEntities.OfType<Knight>()
           from t in k.Tags
           select t;

タグに関連付けられたすべての農民 - これは機能するはずです:

var peasants = from t in context.Tags
               from p in t.Entities.OfType<Peasant>()
               select p;

マップされた継承は、クエリのパフォーマンスに悪影響を及ぼすことに注意してください。

于 2012-08-22T08:00:15.350 に答える