我正在开发一个使用 MVC 模式和 EF 6.0 链接到数据库的 Web 应用程序。为了确保在我的 Web 应用程序上输入的数据正确无误,我想使用数据注释。
我已经按照本教程进行操作,但我目前停留在最后一部分。
上面写着:
将验证属性直接添加到模型类有效 当您不希望数据库更改时;但是,如果您的 数据库更改,您需要重新生成模型类,您将 丢失已应用于模型类的所有属性。这 方法可能非常低效,容易丢失重要 验证规则。
若要避免此问题,可以添加一个元数据类,其中包含 属性。将模型类关联到元数据类时, 这些属性将应用于模型。在这种方法中,模型 类可以重新生成,而不会丢失所有属性 已应用于元数据类。
因此,我按照创建元数据类和分部类的步骤进行操作。
本教程的最后一部分要求我们刷新我所做的模型。 但是,通过这样做,我的类中应该存在的数据注释无处可寻。他们在刷新之前在场,但被我的班级删除了。
预更新/刷新的类工作正常。
更新后的类似乎没有任何限制,例如,我可以插入一个年龄为 11 岁的新客户端,即使不应接受高于 10 的值。
这是我的班级预刷新:
public partial class TaClient
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public TaClient()
{
this.TaBracelets = new HashSet<TaBracelet>();
}
public int IdClient { get; set; }
public string FirstName { get; set; }
[StringLength(50)] //data annotation for FirstName
public string LastName { get; set; }
[StringLength(50)] //data annotation for LastName
public string Sex { get; set; }
public int Height { get; set; }
[Range(3,10)] // data annotation for Age
public int Age { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<TaBracelet> TaBracelets { get; set; }
}
这是我的课堂刷新后:
public partial class TaClient
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public TaClient()
{
this.TaBracelets = new HashSet<TaBracelet>();
}
public int IdClient { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Sex { get; set; }
public int Height { get; set; }
public int Age { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<TaBracelet> TaBracelets { get; set; }
}
这是我的元数据类:
public class TaClientMetadata
{
[StringLength(50)]
[Display(Name = "First Name")]
public string FirstName;
[StringLength(50)]
[Display(Name = "Last Name")]
public string LastName;
[Range(3, 10)]
[Display(Name = "Age")]
public int Age;
}
这是我的部分类:
public class PartialClasses
{
[MetadataType(typeof(TaClientMetadata))]
public partial class TaClient
{
}
}
我可能错过了理解的东西。
您需要扩展原始分部类。为此,您需要在完全相同的命名空间中定义完全相同的类,它们都标有partial
关键字。在自动生成的代码中,partial
关键字已存在。对于自定义分部类定义,必须手动执行此操作:
[MetadataType(typeof(TaClientMetadata))]
partial class TaClient
{
}
这必须直接在命名空间中定义。然而,这不是你正在做的事情。您正在名为PartialClasses
的另一个类中定义嵌套分部类。虽然这将编译良好,但您最终将得到两个类:TaClient
(自动生成(和PartialClasses.TaClient
(由您创建(。
更一般地说:当您通读教程时,有时需要熟悉基本概念。在这种情况下,这将是分部类的概念。