Validation 为什么基于DataAnnotations的手动验证不起作用?

Validation 为什么基于DataAnnotations的手动验证不起作用?,validation,.net-4.0,data-annotations,Validation,.net 4.0,Data Annotations,我试图使用DataAnnotations对类执行手动验证。该应用程序是一个控制台应用程序,因此不涉及MVC。我正在使用.NET4.0 我的指导来自:唯一的区别似乎是我试图使用元数据类。但我读到的其他东西表明这是可以做到的 但是,在运行时,对象通过了验证。我曾在MVC3中使用过数据注释,并认为我对它们很在行,但我感到困惑 我错过了什么?是否需要System.ComponentModel.DataAnnotations以外的程序集 /// This is a partial-class additi

我试图使用DataAnnotations对类执行手动验证。该应用程序是一个控制台应用程序,因此不涉及MVC。我正在使用.NET4.0

我的指导来自:唯一的区别似乎是我试图使用元数据类。但我读到的其他东西表明这是可以做到的

但是,在运行时,对象通过了验证。我曾在MVC3中使用过数据注释,并认为我对它们很在行,但我感到困惑

我错过了什么?是否需要System.ComponentModel.DataAnnotations以外的程序集

/// This is a partial-class addition to an Entity Framework class, so the properties are
/// defined in the EF .designer.cs file.  
[MetadataType(typeof(EntityMetadata.tblThingMetaData ))]
public partial class tblThing
{

}
元数据类:

public partial class tblThingMetaData
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "Sequence number is required")]
    [RegularExpression("A")]
    public string seq_num { get; set; }
}
测试:

    [TestMethod]
    public void VerifyValidationWorksOnEntities()
    {
        tblThing newThing = new tblThing()
        {
            seq_num = "B"
        };

        List<ValidationResult> results = new List<ValidationResult>();
        bool validationResult = Validator.TryValidateObject(
            newThing,
            new ValidationContext(newThing, null, null),
            results,
            true);

        Assert.AreNotEqual(0, results.Count);
        Assert.IsFalse(validationResult);
    }
[TestMethod]
public void verifyvalidationworksonetities()验证
{
tblThing newThing=新tblThing()
{
seq_num=“B”
};
列表结果=新列表();
bool validationResult=Validator.TryValidateObject(
纽廷,
新的ValidationContext(newThing、null、null),
结果,
正确的);
Assert.AreNotEqual(0,results.Count);
Assert.IsFalse(validationResult);
}
我尝试过其他变体:
newThing.seq_num
为null,仅验证
seq_num
属性,等等。它始终通过验证,并且没有验证结果。测试总是失败

非常感谢你给我的任何建议

找到了答案。显然,这在Silverlight或MVC之外不起作用,除非在验证之前添加以下内容:

TypeDescriptor.AddProviderTransparent(
   new AssociatedMetadataTypeTypeDescriptionProvider(
       typeof(tblThing),
       typeof(EntityMetadata.tblThingMetaData)
   ), typeof(tblThing));
请注意,最后一个参数需要是
typeof(tblThing)
,而不是
newThing
。即使存在一个重载,该重载接受与元数据关联的类型的单个实例,并且即使该实例与您计划验证的实例相同,但如果您提供的是实例而不是类型,则该重载将不起作用

虽然很累,但至少现在可以用了