1

いくつかのモデルとデータベースがありますが、何かをリンクする外部キーはありません。これは私のプロジェクトの大きな弱点のように思われるので、モデルに外部キーを挿入してから、モデルに基づいてデータベースを再生成しようとしています。

特に1対多の関係で、外部キーがどのように機能するかを理解するのに問題があります。

この例では、1つまたは複数の製品があり、各製品には複数のレビューがある場合があります。

モデルを凝縮するために、いくつかの注釈と属性を削除しました。

製品モデル/エンティティ:

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

        public int OwnerId {get; set; }

        public string Title { get; set; }

        public int Rating { get; set; }

        public decimal Price { get; set; }

        public int Quantity { get; set; }

        public string Description { get; set; }
    }

モデル/エンティティのレビュー:

 public class Review
    {

        public int ReviewId { get; set; }

        public int ProductId { get; set; }

        public int WriterId { get; set; }

        public string Title { get; set; }

        public string Body { get; set; }
    }

製品のProductIdからレビューのProductIdへの外部キー制約が必要です。これをどのように機能させますか?

4

2 に答える 2

4

2 つのエンティティ間の関係を定義するには、少なくとも 1 つのナビゲーション プロパティが必要です。たとえば、次のようになります。

public class Review
{
    public int ReviewId { get; set; }

    [ForeignKey("Product")]
    public int ProductId { get; set; }
    public Product Product { get; set; }

    public int WriterId { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
}

必要に応じて、コレクション プロパティを追加することもできProductます。

public ICollection<Review> Reviews { get; set; }

属性を使用する代わりに、[ForeignKey]Fluent API で FK を定義できます。

modelBuilder.Entity<Review>()
    .HasRequired(r => r.Product)
    .WithMany()  // or .WithMany(p => p.Reviews)
    .HasForeignKey(r => r.ProductId);
于 2012-05-07T18:47:22.823 に答える
0

外部キーの目的は、テーブルをリンクすることです。たとえば、一意のID番号がある場合、外部キーは簡単に説明できます。productIdは一意のIDであり、おそらく製品テーブルの主キーである必要があります。レビューテーブルでは、productIdは外部キーです。これにより、テーブルを結合し、両方のテーブルのすべてのカテゴリのデータを表示できるようになります。

ProductId、Title、Price、WriterId、Description from Product as P、Review as Rを選択します。ここで、P.ProductId = R.ProductId;

このselectステートメントをurdbに対して実行すると、レビューテーブルの製品の一意のID、タイトル、価格、ライターID、説明が表示されます。キーラインはP.ProductId=R.ProductIdです。

また、外部キーがnullでないことを確認してください

于 2012-05-07T17:47:16.697 に答える