Атрибуты свойств в MetadataType игнорируются проверкой EntLib - PullRequest
0 голосов
/ 14 июля 2011

Это снова проблема EntLib-Validator.Я играю с EntLib 5.0 в C # и .Net 4.0 в XP pro.

У меня есть некоторые бизнес-объекты (частичные классы), созданные с помощью шаблонов T4.Поэтому я решил поместить их атрибуты проверки в классы друзей, используя MetadataTypeAttribute, как определенно рекомендовано документацией entLib 5.0 ( msdn ).Но объект Validator, полученный от ValidatorFactory, не знает об атрибутах проверки, определенных в классе метаданных.

Бизнес-объект определен так:

[MetadataType(typeof(PatientMetadata))]
public partial class Patient
{
    private string _Name;
    private int _DiagnosisCount;

    public int DiagnosisCount
    {
        get
        {
            return _DiagnosisCount;
        }

        set
        {
            if (value != _DiagnosisCount)
            {
                _DiagnosisCount = value;
            }
        }
    }

    public string Name
    {
        get
        {
            return _Name;
        }

        set
        {
            if (value != _Name)
            {
                _Name = value;
            }
        }
    }
}

И класс метаданных, подобный этому, согласно документации:

public class PatientMetadata
{
    [RangeValidator(4)]
    public int DiagnosisCount { get; set; }

    [StringLengthValidator(64, ErrorMessage = "Name must not exceed 64 chars.")]
    public string Name { get; set; }
}

Если я знаю, попробуйте выполнить проверку следующим образом:

    var factory = ValidationFactory.DefaultCompositeValidatorFactory;
    var validator = factory.CreateValidator<Patient>();

... затем посмотрите на validator (во времяуже говорит, что это просто AndCompositeValidator без каких-либо дочерних валидаторов.Опять же, если я добавлю атрибуты валидации прямо в класс Patient, он будет отлично работать.

К настоящему времени я не имею ни малейшего представления о том, чего мне здесь не хватает, поскольку я думаю, что делаю все в соответствии сдокументы.

Заранее спасибо, ребята!

1 Ответ

1 голос
/ 15 июля 2011

Имена свойств класса метаданных должны совпадать с именами свойств основного класса.

В вашем случае ваш класс метаданных должен выглядеть следующим образом:

public class PatientMetadata
{
    [RangeValidator(0, RangeBoundaryType.Inclusive, 10, RangeBoundaryType.Ignore)]
    public int DiagnosisCount { get; set; }

    [StringLengthValidator(6, ErrorMessage = "Name must not exceed 6 chars.")]
    public string Name { get; set; }
}  

Кроме того, документы указывают, что принятым подходом является объявление всех возвращаемых типов как object. Тем не менее, в документах также говорится об использовании свойств, но в их примере используются поля, поэтому имейте это в виду. :)

...