50

明らかに製品を含むProductsというテーブルがあります。ただし、関連商品を作成する必要があります。したがって、私が行ったことは、2つのPKを持つproduct_relatedというジャンクションテーブルを作成することです。ProductsテーブルのProductIDとProductsテーブルのRelatedID。

私はすでにEFを使用しており、他のテーブルにすべてを設定しています。製品自体との関係を作成するには、これを適切に追加するにはどうすればよいですか product.Products.Add(product object here)。もちろん、ここでproductは、を使用してデータベースからフェッチした製品オブジェクトを表していますdb.Products.FirstOr...

これを適切に行うにはどうすればよいですか?同じテーブルに多対多?

ありがとう。

4

2 に答える 2

89

データベースとの多対多の関係を作成するには、最初のアプローチでは、特定のルールに従うデータベーススキーマを設定する必要があります。

  • 主キーとしてProducts列を持つテーブルを作成しますProductID
  • 列と列を含むProductRelationsテーブルを作成し、両方の列を主キー(複合キー)としてマークしますProductIDRelatedID
  • ProductRelationsテーブルに他の列を追加しないでください。EFがこのテーブルを多対多関係のリンクテーブルとして認識できるようにするには、2つのキー列がテーブル内の唯一の列である必要があります。
  • 2つのテーブル間に2 つの外部キー関係を作成します。
    • 最初の関係では、ProductsテーブルはProductID主キーとしてプライマリキーテーブルとして使用され、テーブルは外部キーとしてのみ外部キーProductRelationsテーブルとして使用されます。ProductID
    • 2番目の関係には、Productsテーブルを主ProductIDキーとして使用する主キーテーブルと、外部キーのみを使用する外部キーProductRelationsテーブルとしてのテーブルもあります。RelatedID
  • 2つの関係の最初の関係に対してカスケード削除を有効にします。(両方に対してこれを行うことはできません。SQLServerでは、複数のカスケード削除パスが発生するため、これは許可されません。)

これらの2つのテーブルからエンティティデータモデルを生成すると、 1つのエンティティ、つまりエンティティのみProductが取得されます(または、Products特異化を無効にした場合)。リンクテーブルProductRelationsはエンティティとして公開されません。

Productエンティティには2つのナビゲーションプロパティがあります。

public EntityCollection<Product> Products { get { ... } set { ... } }
public EntityCollection<Product> Products1 { get { ... } set { ... } }

これらのナビゲーションコレクションは、同じ多対多の関係の2つのエンドポイントです。(多対多の関係でリンクしたい2つの異なるテーブルがある場合、たとえばテーブルAB、一方のナビゲーションコレクション(Bs)はエンティティAにあり、もう一方の(As)はエンティティにありBます。ただし、関係が「自己」であるため-参照"両方のナビゲーションプロパティはエンティティにありますProduct。)

2つのプロパティの意味は、次のとおりです。Productsは、特定の製品に関連する製品であり、Products1は特定の製品を参照する製品です。例:関係が、製品が製造される部品として他の製品を必要とし、製品が「ノートブック」、「プロセッサー」、「シリコンチップ」である場合、「プロセッサー」は「シリコンチップ」(「シリコン」 )で構成されます。 「チップ」は製品エンティティのProductsコレクション内の要素です)、「ノートブック」によって使用されます(「ノートブック」は製品エンティティのコレクション内の要素です)。と名前の代わりに、より適切になります。ProcessorProducts1ProcessorProductsProducts1MadeOfUsedBy

関係の片側のみに関心がある場合は、生成されたモデルからコレクションの1つを安全に削除できます。たとえばProducts1、モデルデザイナのサーフェスで削除するだけです。プロパティの名前を変更することもできます。関係はまだ多対多になります。

編集

コメントで尋ねられたように、コードファーストアプローチによるモデルとマッピングは次のようになります。

モデル:

public class Product
{
    public int ProductID { get; set; }

    public ICollection<Product> RelatedProducts { get; set; }
}

マッピング:

public class MyContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>()
            .HasMany(p => RelatedProducts)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("ProductID");
                m.MapRightKey("RelatedID");
                m.ToTable("product_related");
            });
    }
}
于 2012-09-08T13:14:05.243 に答える
0

あなたの例を見てみましょう:

関連

  Related_id      PK
  Related_name
  Date

製品

  Product_id      PK
  Related_id      FK
  Product_Name
  Date

EFでそれを表現する方法

RelatedModelという名前の関連モデルクラス

  [Key]
  public int Related_id { get; set; }

  public string Related_name {get;set}

  public Datetime Date{get;set;}

ProductModelという名前の製品モデルクラス

   [Key]
  public int Product_id { get; set; }

  public string Product_name {get;set}

  public string Related_id {get;set}

  public Datetime Date{get;set;}

  [ForeignKey("Related_id ")]      //We  can also specify here Foreign key
  public virtual RelatedModel Related { get; set; } 

このようにして、2つのテーブル間の関係を作成できます

多対多の関係の場合、ここで別の例を取り上げたいと思います

モデルクラスEnrollment.csがあるとします

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public decimal? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

ここで、CourseIDとStudentIdは2つの外部キーです

今、私は別のクラスCourse.csを持っており、そこで多対多の関係を作成します。

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public int Credits { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

これがお役に立てば幸いです!!!

于 2012-09-12T12:24:37.963 に答える