首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EF进行数据标注

使用EF进行数据标注
EN

Stack Overflow用户
提问于 2011-04-08 15:00:18
回答 3查看 575关注 0票数 0

我尝试过描述为here的DataAnnotation,但它不适用于我。

我有一个具有以下结构的表

代码语言:javascript
复制
Table - Category
    id int (pk not null)
    CategoryName varchar(100) (null)

我已经创建了我的edmx文件。

我也创建了Category.cs文件,如下所示。

代码语言:javascript
复制
[MetadataType(typeof(CategoryMetaData))]
public partial class Category
{
}

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

但是我的验证不起作用。

我是不是漏掉了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-10 19:42:35

更新 Solution here.

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

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

我认为这个问题与代理类有关,EF为您的实体生成代理类。您可以很容易地在运行时检查这一点:只需查看GetType().FullName。

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

我试图通过手动检查属性来在WebForms项目中使用DataAnnotations。但两者都不是

代码语言:javascript
复制
System.ComponentModel.DataAnnotations.Validator.TryValidateObject(entity, new ValidationContext(value, null, null), results, true);

nor

代码语言:javascript
复制
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属性都被正确地找到并检查过。

代码语言:javascript
复制
[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的定义是

代码语言:javascript
复制
[AttributeUsageAttribute(AttributeTargets.Property|AttributeTargets.Field|AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredAttribute : ValidationAttribute

默认情况下,它将成为可继承属性。我不知道为什么

代码语言:javascript
复制
Attribute.GetCustomAttributes(prop, typeof(ValidationAttribute), true)  
// true specifies to also search the ancestors of element for custom attributes.

并没有抓住它。

欢迎任何想法。

票数 0
EN

Stack Overflow用户

发布于 2012-11-07 10:56:38

我发现DataAnnotations不支持ObjectContext。你必须切换到使用DbContext,然后它才能工作。下载EF 4.x DbContext T4文件并在您的模型上试用。不确定为什么这是真的,希望一位专家能加入进来。

票数 2
EN

Stack Overflow用户

发布于 2011-04-08 16:01:56

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

代码语言:javascript
复制
public class CategoryMetaData
{
    [Required(ErrorMessage = "Category Name is required.")]
    public string CategoryName {get;set;}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5591586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档