【问题标题】:Dataannotation with EF使用 EF 进行数据注释
【发布时间】:2011-04-08 07:00:17
【问题描述】:

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

但我的验证不起作用。

我有什么遗漏的吗?

【问题讨论】:

  • 我尝试插入未填充的数据,它插入了一个空值。
  • 您是如何通过 ASP.Net mvc 或简单赋值创建数据的?
  • 为确保您的数据注释部分正常工作,创建一个与具有注释的实体无关的全新类,并尝试使用它。如果它也不起作用,那么这将为您提供一个起点。

标签: entity-framework data-annotations


【解决方案1】:

我发现 ObjectContext 不适用于 DataAnnotations。您必须切换到使用 DbContext,然后它才能工作。下载 EF 4.x DbContext T4 文件并在您的模型上试用。不知道为什么这是真的,希望专家能插话。

【讨论】:

    【解决方案2】:

    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.
    

    没有抓到。

    欢迎提出任何想法。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 仔细检查一下,您的 Category 部分类是否与生成的类在同一个命名空间中?
      • 是的。 edmx 和部分类在同一个目录和命名空间中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2021-01-04
      相关资源
      最近更新 更多