これは私の状況です - 私はいくつかのテーブルレシピ、成分とrecipes_ingredientsという名前のテーブルを持っているDBを持っています。EF経由で基礎となるルックアップをよりよく更新する方法はありますか?
レシピは1+成分で構成されています。
recipes_ingredientsはレシピと成分テーブル間FKSを有しています。
生成されますクラスはrecipe
とingredient
あるとrecipe
はそうのように見えるナビゲーションプロパティがあります。
public virtual ICollection<ingredients> ingredients { get; set; }
グレートを、私は、生成recipe
クラスと生成されたingredient
クラスを得ることを理解し、 recipes_ingredients
表はではありません。これは、EFが単純にナビゲーションプロパティーとして表示するため、クラスを生成します。名前が示すように、成分のリストを更新することで、
public void SetIngredientsForRecipe(long recipeId, List<string> ingredients)
{
using (var db = new FoodEntities(ConnectionString, null, null))
{
var existing = GetCurrentIngredients(recipeId);
var toRemove = existing.Except(ingredients);
var toAdd = ingredients.Except(existing);
var recipe = db.recipes.Where(r => r.Id == recipeId).FirstOrDefault();
foreach (var name in toRemove)
{
var entry = recipe.ingredients.Where(i => i.Name == name).FirstOrDefault();
recipe.ingredients.Remove(entry);
}
foreach (var name in toAdd)
{
var entry = db.ingredients.Where(i => i.Name == name).FirstOrDefault();
recipe.ingredients.Add(entry);
}
db.SaveChanges();
}
}
意図:
今、私は簡潔のために(マイナスとても似のtry-catchコードを探しますSetIngredientsForRecipe
と呼ばれる機能を持っています唯一のリストにあるものは何でも。私はまだEFに慣れるとよりよいがあるかどう思ったんだけど(より効率的に?)に与えられたレシピの私が何をしようとしている達成するための方法。
フォローアップ:
はntziolis以下によって提案に続いて、私はレシピ/成分のマッピングにあったものは何でもクリアする
recipe.ingredients.Clear()
を使用して、すぐに新しいものを追加するために言及されたモックを使うことにしました。このようなもの:
foreach (var name in ingredients)
{
// Mock an ingredient since we just need the FK that is referenced
// by the mapping table - the other properties don't matter since we're
// just doing the mapping not inserting anything
recipe.ingredients.Add(new Ingredient()
{
Name = name
});
}
これは非常にうまく動作します。
追加または削除するかどうかにかかわらず、成分がリストに表示されますか? UIで何が行われたのか(別名リストを渡す)に基づいて、どのアクションを取るべきかを把握することはできませんか? –
UIからのリスト( 'ingredients'パラメータ)は、DBが現在言っていることにかかわらず、成分となるべきものについての"真理 "しか持っていません。私はUIでこれを知ることができたかもしれませんが、単に「UI」と言っているだけの単純さのように、このレシピにあると思われるものを教えてください。しかし、はい、結果は同じになります。 – itsmatt