2012-05-07 17 views
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の上の外部キー制約を望みます。どうすればこの仕事をすることができますか?

答えて

0

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

を選択してください。ProductId、Title、Price、WriterId、Pからの製品説明、Rとしてレビュー: ここで、P.ProductId = R.ProductId;

このselect文をur dbに対して実行すると、レビューテーブルのProduct固有のID、タイトル、価格、ライターIDが表示されます。キーラインがあるP.ProductId = R.ProductIdまた

外部キーは、例えば、あなたが2つのエンティティ間の関係を定義するために、少なくとも1つのナビゲーションプロパティを必要とする

4

nullではないことを確認してください:

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]属性を使用しますあなたは流暢APIでFKを定義することができます。

modelBuilder.Entity<Review>() 
    .HasRequired(r => r.Product) 
    .WithMany() // or .WithMany(p => p.Reviews) 
    .HasForeignKey(r => r.ProductId); 
+0

をModelBuilderのがOnModelCreatingの内側に次の特定され、正しい現在、私は( 'modelBuilder.Entity を使用).ToTable( "レビュー"、SCHEMANAME: "MYSCHEMA");' I?私のコードに基づいてデータベースを再生成する必要がありますか? – Johannes

+0

@Johannes:はい、 'OnModelCreating'にあります。現在のマッピングではエンティティをテーブル名にのみマッピングします。マッピングコードを追加するには、 'modelBuilder.Entity ()....'を繰り返してください。 DBを再生成する必要はありません。また、DB初期化子( 'Database.SetInitializer (null)')と一致するように、DBスキーマとモデルの「並列」変更を行うこともできます。 DBは生産中です。開発段階にある場合は、EFがDBスキーマを再生成するのを助けます。これは、それがモデルと一致することを保証するためです。または、EF 4.3の「移行」機能を使用することもできます。 – Slauma