实体框架+验证注释

nos*_*bor 3 c# validation asp.net-mvc entity-framework

我想使用验证anotation.我已经有一个由实体框架实现的模型.我需要数据验证,我知道有一个非常好的数据anotation ...但我真的不知道如何使用它与实体框架正确.

我应该编辑实体吗?或者我应该写分开的课程?或者我应该编写从实体继承的类?

你能告诉我应该使用的最佳方式吗?

我想编写尽可能少的代码.

Mic*_*eld 14

处理此问题的方法是部分类和特殊属性的组合,允许您将元数据附加到另一个类.

实体框架已经通过将所有类生成为部分类来帮助您.因此,如果您的模型中有一个名为Settings的实体,那么EF会创建:

public partial class Setting : INotifyPropertyChanging, INotifyPropertyChanged
{
    // Auto-gen Properties, methods, etc go here.
}
Run Code Online (Sandbox Code Playgroud)

这意味着您可以partial class Setting在其他文件中包含任意数量的其他片段,如果/当您重新生成该代码时,EF将不会触及这些片段.如果要向其添加数据验证属性,则需要两个步骤:

  1. 将MetadataType属性附加到Setting类.在这个部分类片段的主体中不需要任何东西,它只是与属性相关联.

    [MetadataType(typeof(SettingMetadata))]   
    public partial class Setting
    {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建第二个类,其具有与EF类相同的公共字段名称,并关联所需的任何数据验证属性.编译器将按名称将元数据类字段与EF类字段进行匹配,并且无论您的第二个类附加到第二个类的元数据也在您的第一个类上.

    public class SettingMetadata
    {
        [Display(Name="Base Rate")]
        [Required]
        public decimal Rate
        {
            get;
            set;
        }
    
        [Display(Name = "Permit Payments")]
        public Boolean AllowPayments
        {
            get;
            set;
        }
    
        [Display(Name = "Base URL For Web Service")]
        [Required]
        [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Type must match linked metadata type.")]
        public string WebServiceUrl
        {
            get;
            set;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

如FxCop抑制消息中所述,字段的名称和类型必须在元数据类和关联类之间匹配才能生效.