簡體   English   中英

MVC EF正確對代碼進行分層,以及從數據庫更新模型時如何修復導航命名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM