问题描述
|
我想使用验证注释。
我已经有一个由实体框架实现的模型。
我需要数据验证,而且我知道有一个数据注释非常好...
但是我真的不知道如何在正确的实体框架下使用它。
我应该编辑实体吗?还是我应该写分开的课?还是应该编写从实体继承的类?
您能告诉我最好的使用方式吗?
我想写尽可能少的代码。
解决方法
处理此问题的方法是结合使用部分类和特殊属性,该属性允许您将元数据附加到另一个类。
实体框架已经通过将所有类生成为部分类来为您提供帮助。因此,如果您的模型中有一个名为“设置”的实体,则EF会创建以下内容:
public partial class Setting : INotifyPropertyChanging,INotifyPropertyChanged
{
// Auto-gen Properties,methods,etc go here.
}
这意味着您可以在其他文件中包含任意数量的其他“ 1”片段,如果/当您重新生成该代码时,EF不会触摸这些片段。如果要为此添加数据验证属性,则需要两个步骤:
将MetadataType属性附加到Setting类。此局部类片段的主体中不需要任何内容,仅是用于关联属性的地方。
[MetadataType(typeof(SettingMetadata))]
public partial class Setting
{
}
创建与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禁止消息中所述,字段的名称和类型必须在元数据类和关联的类之间匹配才能起作用。
,数据注释是需要添加到实体属性的验证器属性。标准属性有很多,或者,如果它们不能满足您的需要,您可以创建自定义属性。
检查此链接。