2017-12-03 7 views
1

EF 6.Xでコードファーストアプローチを使用しています。 2つのエンティティと関連があります。私は、モデルからデータベースを作成する項目を追加し、それらをリードバックすることができる午前予想される命名規則を使用していたようエンティティをデータベースから読み取るときに外部キーに関連付けられたプロパティが設定されていない

class Product 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
    ProductCategory ProductCategory { get; set; } 
} 

class ProductCategory 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
} 

class ProductContext : DbContext 
{ 
    public DbSet<Product> Products { get; set; } 
    public DbSet<ProductCategory> ProductCategories { get; set; } 
} 

は - データ注釈なしと流暢を使用せずAPI。 さて、実際には、Fluent APIを使用していくつかのプロパティでHasMaxLengthを設定しますが、その設定コードではキーや外部キーが設定されません。

ここで重要なポイントは以下の呼び出し時ということである。

Product product = context.Products.Find(1).FirstOrDefault(); 

製品のProductCategoryが正しくProductCategoryインスタンスが移入されます。 私が遭遇している問題は、この動作が一貫していないように見えることです。

WebApiコントローラ内で、ProductContextクラスのインスタンスを作成し、上記のスニペットと同じ操作を読み込みます。 結果は正しくインスタンス化されていますが、ProductCategoryプロパティがnullに設定されているProductです。

この2つの使用法の違いは何ですか? Productテーブルの外部キーエントリをProductCategoryクラスのインスタンスに変換できるようにするために、DbContextから派生したコンテキストの前提条件は何ですか?

+1

はここにいくつかのより多くの関連するコードを追加します。 EFコンテキストをどのように設定しますか? – Fabjan

+1

*製品のProductCategoryにProductCategoryインスタンスが正しく挿入されている* - 'ProductCategory'は遅延読み込みではありません(' virtual'ではありません)。 2つのコードがどの点で異なるかを注意深く確認してください。 –

答えて

1

デフォルトでエンティティフレームワークは、DBからオブジェクトをロードするときに関連オブジェクトをロードしません。以下を行う必要があります。

使用Include声明:

context.Products.Include(p => p.ProductCategory).FirstOrDefault(p => p.Id == 1); 

またはvirtualとしてあなたのナビゲーションプロパティをマークすることによって遅延ロードを使用します。

class Product 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
    virtual ProductCategory ProductCategory { get; set; } 
} 

次に、あなたのProductCategoryが必要になります読み込まれた最初の時間です触って。手動

またはロード参照:

context.Entry(product).Reference(p => p.ProductCategory).Load(); 
関連する問題