使用EF进行数据注释

时间:2011-04-08 07:00:18

标签: entity-framework data-annotations

我已按照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;
}

但我的验证无效。

有什么我错过的吗?

3 个答案:

答案 0 :(得分:2)

我发现ObjectContext不能与DataAnnotations一起使用。你必须切换到使用DbContext,然后它的工作原理。下载EF 4.x DbContext T4文件并在您的模型上试用。不知道为什么会这样,希望专家能够参与进来。

答案 1 :(得分:0)

CateogryMetaData中的CategoryName应该是一个属性,并且与原始属性具有相同的类型。试试这个:

public class CategoryMetaData
{
    [Required(ErrorMessage = "Category Name is required.")]
    public string CategoryName {get;set;}
}

答案 2 :(得分:0)

<强> UPD Solution here.

  

在验证之前,您需要手动注册元数据类

==================

我认为这个问题与EF为您的实体生成的代理类有关。您可以在运行时轻松检查:只需查看GetType()。FullName。

如果属性被标记为不可继承,则不会在继承的类中应用它。代理类派生自实体类,因此不可继承的属性会丢失。

我正在尝试通过手动检查属性在WebForms项目中使用DataAnnotations。但不是

System.ComponentModel.DataAnnotations.Validator.TryValidateObject(entity, new ValidationContext(value, null, null), results, true);

,也不

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.

没有抓住它。

欢迎任何想法。

相关问题