2016-12-03 5 views
1

のない私は、エンティティフレームワーク6とのASP MVC5アプリでの作業などのようにナビゲーションプロパティを持つオブジェクトを作成したいのです:割り当てEntity Frameworkのナビゲーションプロパティクエリ

プロパティ Categoryは別のエンティティである
public class widget 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Category Category { get; set; } 
} 

データベースモデルでは、私はCRUD機能を実装すると、私はそうのようなビューモデルを作成します。

public class EditWidgetViewModel 
{ 
    public List<SelectListItem> Categories { get; set; } 
    public int CategoryId { get; set; } 
} 

とSelectListの内容は、HTML形式のドロップダウンになります。次に、ユーザーがフォームを送信すると、CategoryIdがサーバーにポストバックされます。私はすでにID番号を知っている - 私はdb.Widgets.Find(WidgetId)で別のDBのルックアップを実行せずにカテゴリナビゲーションプロパティを割り当てることができます。

var dbWidget = new Widget 
{ 
    Name = model.Name, 
    Category = db.Categories.Find(CategoryId) 
} 

db.Widgets.Add(dbWidget); 
db.SaveChanges(); 

だから、私の質問は以下の通りです:そこから、私は現在、変更を保存するには、次のようなものをやっていますルックアップを行わずにデータベースのウィジェットテーブルのCategory_Category_Id列に移動する必要があります。また、5つまたはそれ以上のナビゲーションプロパティを持つものがあれば、それぞれのラウンドトリップで大きなパフォーマンス上の問題になるようです。

答えて

0

その後、dbContextのエントリ()を使用し、適切なID を割り当て、コンストラクタで新しいエンティティを作成することができ、このような状態:

Category category = new Category { Id = CategoryId }; 
db.Entry(category).State = EntityState.Unchanged; 

var dbWidget = new Widget 
{ 
    Name = model.Name, 
    Category = category 
} 

db.Widgets.Add(dbWidget); 
db.SaveChanges(); 
+0

おかげでアレックス、これは素晴らしい作品!好奇心のために、間違ったID(つまり存在しないID)を割り当てていると言うことができます - これはエラーを投げますか? – Ben

+0

気象によって異なりますが、データベースに定義されている外部キーの関係はありません。 このコードはすべて、CategoryIdをコードでインスタンス化するカテゴリのIDに設定します。データベースにSaveChangesという外部キー制約があると、スローされます。 –

関連する問題