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



我有两个问题。

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

第二个问题是……但我最好举个例子。我有一个称为Categories的模型和另一个CategoriesTranslations的模型,它们都是从我的数据库映射而来的。假设您希望在网站的许多视图(不同控制器的视图)中的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>的Extension方法,并将此方法放入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();

最新更新