這裏是我的情況 - 我有這有一個名爲食譜,成分和recipes_ingredients一些表的DB。通過EF更新底層查找的更好方法?
食譜是由1+成分組成。
的recipes_ingredients具有食譜和成分表之間FKS。
是那些獲得生成的類是recipe
和ingredient
和recipe
有一個看起來像這樣的導航屬性:
public virtual ICollection<ingredients> ingredients { get; set; }
太好了,我明白,我得到一個產生recipe
類和生成的ingredient
類recipes_ingredients
表不會獲得一個類,因爲EF將其視爲一個導航屬性。現在
,我有一個叫做SetIngredientsForRecipe
功能,看起來像這樣(減去在try-catch代碼爲簡潔起見:
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();
}
}
這樣做的目的,顧名思義,是更新成分表對於給定的食譜只能無論是在列表中。我仍然獲得舒適與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中完成的操作來確定要採取哪種操作(並傳入不同的列表)嗎? – 2012-03-01 13:42:10
無論數據庫當前如何表示,來自UI(「配料」參數)的列表僅具有關於應該是什麼成分的「真相」。我*可能*可能在用戶界面中知道這一點,但只需簡單地說一下「用戶界面,告訴我這個配方中應該包含什麼」。但是,結果是一樣的。 – itsmatt 2012-03-01 13:55:35