我有两个问题。
第一个是关于那个时刻,当您去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();