2011-05-25 103 views
3

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

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

你能告诉我我应该使用的最好方法吗?

我想尽可能地写出尽可能少的代码。

+1

要添加什么样的验证?你能告诉我们一些课程代码吗? – 2011-05-25 14:00:42

回答

14

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

实体框架已经通过生成所有类为部分类来帮助您。所以,如果你有在你的模型所调用的设置一个实体,在EF会造成这样的:

public partial class Setting : INotifyPropertyChanging, INotifyPropertyChanged 
{ 
    // Auto-gen Properties, methods, etc go here. 
} 

这意味着你可以有任意数量的其他文件等partial class Setting片段,其中EF不会,如果触碰/时您重新生成该代码。如果要为此添加数据验证属性,则需要两步:

  1. 将MetadataType属性附加到Setting类。这部分类片段的主体中不需要有任何内容,它只是在那里关联属性。

    [MetadataType(typeof(SettingMetadata))] 
    public partial class Setting 
    { 
    } 
    
  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; 
        } 
    } 
    

如FxCop的抑制消息中提到,该名称并键入字段的必须为此工作的元数据类和相关联的类之间匹配。

2

数据注释是您需要添加到实体属性的验证器属性。有许多标准属性,或者如果它们不能满足您的需求,可以创建自定义属性。

Check this link.