我想使用验证anotation。 我已经有一个由实体框架实现的模型。 我需要数据验证,我知道有一个非常好的数据anotation ... 但我真的不知道如何在实体框架正确使用它。
我应该编辑实体吗?或者我应该写分开的课程?或者我应该编写从实体继承的类吗?
你能告诉我应该使用的最好方法吗?
我想写尽可能少的代码。
答案 0 :(得分:14)
处理此问题的方法是部分类和特殊属性的组合,允许您将元数据附加到另一个类。
实体框架已经通过将所有类生成为部分类来帮助您。因此,如果您的模型中有一个名为Settings的实体,那么EF会创建它:
public partial class Setting : INotifyPropertyChanging, INotifyPropertyChanged
{
// Auto-gen Properties, methods, etc go here.
}
这意味着您可以在其他文件中包含任意数量的其他partial class Setting
片段,如果/重新生成该代码,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抑制消息中所述,字段的名称和类型必须在元数据类和关联类之间匹配才能生效。
答案 1 :(得分:2)
数据注释是您需要添加到实体属性的验证器属性。有许多标准属性,或者如果它们不能满足您的需求,您可以创建自定义属性。