[英]MVC EF layering the code correctly and how to fix navigation naming when updating models from database
我有兩個問題。
第一個是關於當您進入EDM並從數據庫中更新模型的那一刻,它重寫了舊模型,丟失了您在其中編輯的所有內容。 我讀了一些有關它的內容,據說您可以創建另一個模型並使它們也成為局部模型,在那里您可以再次放置字段,因此在下次更新時,它不會影響您的最后更改。 我怎樣才能做到這一點? 我為DAL有一個單獨的項目,並且模型是從數據庫生成的(我有一個EDM)。
第二個問題是……但更好的是我舉一個例子。 我有一個名為Categories
的模型,另一個是CategoriesTranslations
,它們都從我的數據庫映射。 假設您想在網站(不同控制器的許多視圖DropDownList()
的DropDownList()
中包含此類別的列表。 DropDrown的值將包含取決於當前語言的翻譯和包含類別ID的鍵。 這是我的清單的一個例子:
List<SelectListItem> listItems = new List<SelectListItem>();
var CategoriesTexts = db.Categories.Include(i => i.CategoryTexts).ToList();
foreach (var cat in CategoriesTexts)
{
var texts = cat.CategoryTexts.Where(w=>w.Language.Format == (string)Session["chosen_language"]).FirstOrDefault();
listItems.Add(new SelectListItem
{
Text = texts == null ? cat.Id.ToString() : texts.Name,
Value = cat.Id.ToString(),
});
}
我應該將該代碼放在我的網站結構中的什么位置(或如何構造它),以便在我的大多數視圖中使用它?
謝謝!
對於第一個問題
當您更新EF EDMX文件時,不必僅創建部分類來修復命名。 實際上,在對數據庫進行更新時,您不應該從Edmx中刪除模型類,您所需要做的只是更新模型,它會保存已經創建的導航屬性名稱。
對於第二個問題
盡管我不同意將類別添加到DropDownList的方法,但是您可以將其作為IEnumerable<Category>
擴展方法,並將此方法放入ViewModelExtensions項目中
例如
public static IList<SelectListItem> ToDropDownList(this IEnumerable<Category> query)
{
List<SelectListItem> listItems = new List<SelectListItem>();
foreach (var cat in query)
{
var texts = cat.CategoryTexts.Where(w=>w.Language.Format == (string)Session["chosen_language"]).FirstOrDefault();
listItems.Add(new SelectListItem
{
Text = texts == null ? cat.Id.ToString() : texts.Name,
Value = cat.Id.ToString(),
});
}
}
然后像這樣在您的控制器中調用它:
var list = db.Categories.Include(i => i.CategoryTexts).ToDropDownList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.