0

MVC EF4.1 を使用して、テーブル (TableMaster) を TableChildOne (1 対 0 または 1 の関係) および TableChildTwo (1 対 0 または 1) にリンクしようとしています。TableChildOne と TableChildTwo は直接リンクされていません。

TablechildOne と TableChildTwo は、TableMaster の主キーを共有する必要があります (これは不可能だと読みましたが、回避策はありますか?)

これをもう少し明確にするために画像を含めています。外部キーをどこかに追加する必要があるかどうかはわかりません。これはコードによって作成された実際のモデルではありませんが、私が望むものです。どこかに外部キーが必要かどうかわかりませんか?

画像 : http://www.davidsmit.za.net/img/untitled.png

以下のコードはコンパイルされますが、コントローラーを追加しようとするとエラーが発生します。

「同じキーのアイテムが既に追加されています」

  public class TableMaster
{
    public int TableMasterID { get; set; }

    public DateTime ReportDate { get; set; }

    public virtual TableChildOne TableChildOne { get; set; }
    public virtual TableChildTwo TableChildTwo { get; set; }
}

public class TableChildOne
{
    [Key]
    public int TableMasterID { get; set; }

    public String Description_1 { get; set; }

    public virtual TableMaster TableMaster { get; set; }
}

  public class TableChildTwo
  {
     [Key]
      public int TableMasterID { get; set; }

     public String Description_2 { get; set; }

     public virtual TableMaster TableMaster { get; set; }
}

public class Context : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TableMaster>()
            .HasOptional(p => p.TableChildOne).WithRequired(p => p.TableMaster);

        modelBuilder.Entity<TableMaster>()
            .HasOptional(p => p.TableChildTwo).WithRequired(p => p.TableMaster);

}

2 番目のテーブルを完全に削除すると、正常に動作します。

以下のリンクを例として使用しました (OfficeAssignment テーブルと Student テーブル)。これは、テーブルを 1 対 0 または 1 でリンクする方法を示しています。しかし、同じリンケージを持つ別のテーブルを追加するのに問題があります: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model- for-an-asp-net-mvc-アプリケーション

どんな助けでも大歓迎です。

ありがとうございます

4

1 に答える 1

0

なぜこれをしたいのかについて、より多くの背景を教えていただけますか?3つのテーブル間で主キーを共有している場合は、データを分割しています。どのような開発シナリオに対処しようとしていますか。オブジェクトの継承をマップしたいと思うかもしれませんね。

説明が2つしかない場合、これは実際には1つのテーブルにすぎません。

編集:

涼しい。このリクエストのビジネスコンテキストは少しあいまいなので、まだよくわかりません。申し訳ありません。TableMasterといくつかの子テーブルがある場合、これは継承ツリーのように聞こえます。したがって、EFを使用すると、これをモデル化するためのさまざまな戦略(TPH、TPTなど)を選択できます。このため、TPTを調べることをお勧めします。これにより、データをクリーンアップする方法の粒度を取得できる可能性があるためです。また、デフォルトでは、指定したとおりにテーブルが作成されるという利点があります。参考までにこれをチェックしてください。

于 2012-02-02T17:47:37.050 に答える