Атрибуты свойств в MetadataType игнорируются проверкой EntLib.

Это снова проблема EntLib-Validator. Я играю с EntLib 5.0 на С# и .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, все будет работать отлично.

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

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


person Andreas H.    schedule 14.07.2011    source источник


Ответы (1)


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

В вашем случае ваш класс метаданных должен выглядеть так:

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. Тем не менее, документы также говорят об использовании свойств, но в их примере используются поля, поэтому примите это к сведению. :)

person Randy supports Monica    schedule 15.07.2011
comment
Вы правы, но проблема с именами была именно в моем примере, а не в самом приложении. Но тем временем я понял, что необходимо использовать свойства в классе метаданных, если у меня есть свойства в исходном классе. Как вы сказали, они используют поля в документах, что, я думаю, вводит в заблуждение. Тип данных не имеет значения, они вообще предлагают использовать объект, но вы все равно можете использовать соответствующие типы, если хотите. - person Andreas H.; 15.07.2011