我尝试过描述为here的DataAnnotation,但它不适用于我。
我有一个具有以下结构的表
Table - Category
id int (pk not null)
CategoryName varchar(100) (null)我已经创建了我的edmx文件。
我也创建了Category.cs文件,如下所示。
[MetadataType(typeof(CategoryMetaData))]
public partial class Category
{
}
public class CategoryMetaData
{
[Required(ErrorMessage = "Category Name is required.")]
public object CategoryName;
}但是我的验证不起作用。
我是不是漏掉了什么?
发布于 2011-04-10 19:42:35
在验证之前,您需要手动注册元数据类
==================
我认为这个问题与代理类有关,EF为您的实体生成代理类。您可以很容易地在运行时检查这一点:只需查看GetType().FullName。
如果属性被标记为不可继承,它将不会应用于继承的类。而代理类派生自实体类,因此不可继承的属性将丢失。
我试图通过手动检查属性来在WebForms项目中使用DataAnnotations。但两者都不是
System.ComponentModel.DataAnnotations.Validator.TryValidateObject(entity, new ValidationContext(value, null, null), results, true);nor
PropertyInfo[] properties = value.GetType()
.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
var validationProperties = properties.Select(prop => new
{
Property = prop,
ValidationAttributes = Attribute.GetCustomAttributes(prop, typeof(ValidationAttribute), true)
}).Where(valProp => valProp.ValidationAttributes.Any());不起作用。我已经用与EF无关的简单类尝试了这些代码,所有的DataAnnotations属性都被正确地找到并检查过。
[MetadataType(typeof(TestValidObject_Metadata))]
public class TestValidObject
{
public string IdName { get; set; }
}
public class TestValidObject_Metadata
{
[Required, DisplayName("Id name")]
public object IdName { get; set; }
}RequiredAttribute的定义是
[AttributeUsageAttribute(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredAttribute : ValidationAttribute默认情况下,它将成为可继承属性。我不知道为什么
Attribute.GetCustomAttributes(prop, typeof(ValidationAttribute), true)
// true specifies to also search the ancestors of element for custom attributes.并没有抓住它。
欢迎任何想法。
发布于 2012-11-07 10:56:38
我发现DataAnnotations不支持ObjectContext。你必须切换到使用DbContext,然后它才能工作。下载EF 4.x DbContext T4文件并在您的模型上试用。不确定为什么这是真的,希望一位专家能加入进来。
发布于 2011-04-08 16:01:56
CateogryMetaData中的CategoryName应该是一个属性,并且与原始属性具有相同的类型。试试这个:
public class CategoryMetaData
{
[Required(ErrorMessage = "Category Name is required.")]
public string CategoryName {get;set;}
}https://stackoverflow.com/questions/5591586
复制相似问题