3

複数のテーブルが複数の可能な親テーブルから参照できるようにする必要があるドメイン モデルを構築しています。たとえば、メモやファイルを格納するテーブルがあり、それらのメモやファイルをさまざまな親エンティティに関連付けることができます。同じ「ファイル」または「メモ」を複数の所有者に関連付けることはできませんが、「ファイル」テーブルの 10 行のうち、そのうちの 3 行が「顧客」テーブルの行によって所有されている可能性があります。 「Orders」テーブルの行が所有し、そのうちの 4 つは「Person」テーブルの行が所有している可能性があります。

所有するすべてのテーブルには、子テーブルの仮想 ICollection があります。

最初の移行のためにコードの最初の移行を通じてモデルを実行し、生成された流暢なコードを確認したとき、これらのテーブルのテーブル定義には、ソース テーブルを参照する複数の id 列が含まれていたため、列「customer_id」が存在します。 」、「person_id」など (考えられる「所有エンティティ」ごとに 1 つ。これは完全に「正しい」とは思えません。CodeFirst を使用して EF でこれをモデル化するより良い方法はありますか?所有エンティティに関する「ヒント」を提供する子テーブル?

ありがとう、-MrB

4

2 に答える 2

4

メモと、メモを持つことができるすべてのエンティティとの間に多対多の関係を作成すると、所有タイプごとにジャンクション テーブルが作成され、きれいなメモ テーブルが作成されます。多対多の関係を作成する最も簡単な方法は、DbContext.OnModelCreatingメソッドをオーバーライドすることです。

あなたのDbContext:

  public class MyDatabase : DbContext
  {
    // Protected methods

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      base.OnModelCreating(modelBuilder);

      modelBuilder.Entity<Customer>().HasMany(x => x.Notes).WithMany();
      modelBuilder.Entity<Order>().HasMany(x => x.Notes).WithMany();
    }

    public MyDatabase() : base("MyDatabase")
    {
    }

    // Properties

    public DbSet<Customer> Customers { get; set; }

    public DbSet<Order> Orders { get; set; }

    public DbSet<Note> Notes { get; set; }
  }

これにより、次のテーブルが生成されます: CustomerOrdersNotesCustomerNotes、およびOrderNotesで、最後の 2 つはそれぞれ 2 つの列のみを持つジャンクション テーブルです。

ノート!このソリューションでは、エンティティがメモを共有することも可能です。たとえば、顧客と注文が同じメモを所有できます。

于 2012-10-20T19:30:51.597 に答える
0

適合するかどうかはわかりませんが、EF 階層を使用してそれを行うことができます。この記事を参照してください:

http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph. aspx

基本的に、ノートには 3 つのタイプがあり、すべて基本的なノート タイプから継承されます。

EF には 3 種類の階層があるため、3 部構成の記事です...

于 2012-10-20T19:06:39.567 に答える