在代码重新生成之间保留显示名称



我在SQL Server中创建了一个数据库,并使用实体框架在我的C# MVC 5项目中创建了一个模型。 在我的模型中,我使用 System.ComponentModel 为多个属性(或列)提供 DisplayName。 例:

namespace ProjectTracking.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    public partial class EmployeeType
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public EmployeeType()
        {
            this.Employees = new HashSet<Employee>();
        }
        [DisplayName("Employee Type ID")]
        public int PK_EmployeeTypeID { get; set; }
        [DisplayName("Employee Type Name")]
        public string EmployeeTypeName { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Employee> Employees { get; set; }
    }
}

我遇到的问题是,如果我更新数据库并更新我的模型,我会丢失所有这些信息,因为所有模型类都是重新生成的。 有没有办法保留此信息?

EF 正在使用 T4 模板生成代码。切勿编辑这些文件,因为打开设计器时可以随时重新生成这些文件。

有一种方法可以做到这一点,使用MetadataTypeAttribute'

EF 将模型生成为分部类,因此您可以在其他文件中添加另一个部件,该文件不会重新生成并对其MetadataTypeAttribute。这将指向另一个类,您可以在其中复制属性并提供DisplayNameAttribute。喜欢这个:

[MetadataType(typeof(EmployeeTypeMetaData))]
public partial class EmployeeType  { }
public class EmployeeTypeMetaData
{
    [Required(ErrorMessage = "Title is required.")]
    public object Title;
    // etc
}

这将是工作...然而:

出于以下原因,不应使用它:

  • 这将给您带来维护噩梦。每当模型更改时,您还需要更改元数据
  • 切勿在某种视图中直接使用 ef 模型。在两者之间使用 DTO 对象,并在 ef 模型和 DTO 之间进行映射。映射可以通过手动完成,也可以通过自动映射器等工具完成

最好的选择是不直接将实体框架实体用作视图模型。 而是创建表示需要显示的内容的视图模型,并将实体中的值映射到视图模型(使用自动映射器使这变得轻而易举)。

"直接作为视图模型"是什么意思

您的代码可能如下所示:

public class MyContextDb
{
  public DbSet<EmployeeType> EmployeeTypes { get; set; }
}
public class MyController
{
  public ActionResult Index()
  {
    using (var db = new MyDbContext)
    {
      var emp = db.EmployeeTypes.FirstOrDefault();
      return View(emp);  // <-- passing EF entity as view model
    }
  }
}

相反

public EmployeeTypeVM
{
  // Properties you want to expose and annotate
}
    using (var db = new MyDbContext)
    {
      var emp = db.EmployeeTypes.FirstOrDefault();
      var vm = Mapper.Map<EmployeeTypeVM>(emp);
      return View(vm);  // <-- passing view model
    }

我总是推荐这种方法,因为您通常不会更改 emp,只有具有逻辑和意外SaveChanged()的 vm 不会影响实际数据。

相关内容

最新更新