C# MVC EF正确分层代码,以及如何在从数据库更新模型时修复导航命名

C# MVC EF正确分层代码,以及如何在从数据库更新模型时修复导航命名,c#,asp.net-mvc,entity-framework,tree,C#,Asp.net Mvc,Entity Framework,Tree,我有两个问题 第一个是关于那个时刻,当您转到EDM并从数据库更新您的模型时,它重写了旧模型,丢失了您在其中编辑的所有内容。我读了一点关于这一点,据说你可以创建另一个模型,并使他们也部分,在那里你可以再次放置字段,以便在下次更新它不会影响你的最后更改。我该怎么做?我有一个单独的DAL项目,模型是从数据库生成的(我有一个EDM) 第二个问题是。。。但我最好举个例子。我有一个名为Categories的模型和另一个CategoriesTranslations的模型,它们都是从我的数据库映射而来的。假设您

我有两个问题

第一个是关于那个时刻,当您转到EDM并从数据库更新您的模型时,它重写了旧模型,丢失了您在其中编辑的所有内容。我读了一点关于这一点,据说你可以创建另一个模型,并使他们也部分,在那里你可以再次放置字段,以便在下次更新它不会影响你的最后更改。我该怎么做?我有一个单独的DAL项目,模型是从数据库生成的(我有一个EDM)

第二个问题是。。。但我最好举个例子。我有一个名为
Categories
的模型和另一个
CategoriesTranslations
的模型,它们都是从我的数据库映射而来的。假设您希望在网站(不同控制器的)的多个视图中的
DropDownList()
中包含此类别的列表。dropcrown将具有包含翻译的值,该值取决于当前语言和包含类别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(),
  });
}
List listItems=new List();
var CategoriesTexts=db.Categories.Include(i=>i.categoritytexts.ToList();
foreach(类别Exts中的变量cat)
{
var text=cat.CategoryTexts.Where(w=>w.Language.Format==(string)Session[“selected_Language”]).FirstOrDefault();
添加(新建SelectListItem)
{
Text=Text==null?cat.Id.ToString():Text.Name,
Value=cat.Id.ToString(),
});
}
我应该把这些代码放在我的网站结构中的什么地方(或者我应该如何构造它),以便在我的大多数视图中使用它

谢谢大家!

关于你的第一个问题

更新EF EDMX文件时,不需要创建分部类来修复命名。实际上,当您对数据库进行更新时,不应该从Edmx中删除模型类,您需要做的只是更新模型,它将保存您的导航属性名称,就像您已经创建了它们一样

关于第二个问题

虽然我不同意您如何将类别添加到DropDownList,但您可以将其作为
IEnumerable
的扩展方法,并将此方法放在ViewModelExtensions项目中

e、 g


关于第一个问题。你更新的帖子并不是我想要的。你说的导航是什么意思?我是说,如果我从数据库中更新我的EDMX,如果我在过去为我的模型设置了一些显示名称,它们将在更新后消失。关于第二个问题。你为什么不同意呢?这是较少的冗余代码。您还可以给我一些关于ViewModelExtension项目的更多信息吗?
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();