Любой способ отключить проверку при использовании System.ComponentModel.DataAnnotations? - PullRequest
2 голосов
/ 21 января 2011

Другие запросы здесь, к сожалению, не отвечают на мой вопрос, и я надеюсь, что этот вопрос будет гениальным.

В настоящее время проблема в том, что у меня есть объект домена 'GamePlayer', который имеетряд DataAnnotations для проверки модели данных, поступающих из пользовательского интерфейса.Они отлично работают, полностью тестируемы и т. Д.

У нас, однако, есть база данных, в которой данные могут произвольно расти в течение нескольких лет (примерно 660 000 учетных записей пользователей), и я бы сказал, что между 20 000и 50 000 учетных записей в настоящее время нарушают правила, которые мы наложили на объект GamePlayer.

Итак, я надеюсь, что смогу использовать аннотации данных, но иметь возможность отключить их напуть от БД до заполнения модели.

Я знаю, что если я использую материал ModelMetaData, сохраняю атрибуты проверки в другом классе и связываю основной класс с [MetadataType (typeof (GamePlayerMetadata))], Я могу сделать:

TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(GamePlayer), typeof(GamePlayerMetadata)), typeof(GamePlayer));

и, следовательно, сделать обратное (.RemoveProvider), чтобы удалить правила - это работает, хотя я бы предпочел не использовать класс ModelMetaData и хранить все в одном, еслиЯ могу?

Надеюсь, не слишком трепетно:)

Приветствия за любую помощь, Терри

Дополнительная информация, чтобы надеятьсяподдержать случай:

[Serializable]
[MetadataType(typeof(AddressMetadata))]
public class Address
{
    [NonSerialized]
    private readonly AssociatedMetadataTypeTypeDescriptionProvider metadataAddress;

    public string House { get; private set; }
    public string SubPremises { get; private set; }
    public string Street { get; private set; }
    public string Town { get; private set; }
    public string County { get; private set; }
    public string Country { get; private set; }
    public string Postcode { get; private set; }


    internal Address()
    {
        metadataAddress             = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Address), typeof(AddressMetadata));
        TypeDescriptor.AddProviderTransparent(metadataAddress, typeof(Address));
    }

    internal Address(AddressDto address) : this()
    {
        this.House          = address.House;
        this.SubPremises    = address.SubPremises;
        this.Street         = address.Street;
        this.Town           = address.Town;
        this.County         = address.County;
        this.Country        = address.Country;
        this.Postcode       = address.Postcode;
    }

    public Address(string house, string subPremises, string street, string town, string county, string country, string postcode) : this()
    {
        SetAddress(house, subPremises, street, town, county, country, postcode);
    }


    #region ------------------------------------------------------------------------------------- Methods --
    public bool IsSet()
    {
        return !((String.IsNullOrEmpty(House) && String.IsNullOrEmpty(this.SubPremises)) && String.IsNullOrEmpty(Postcode) && String.IsNullOrEmpty(Street));
    }

    /// <exception cref="ValidationException">Thrown when one of the fields doesn't match the business complexity rules</exception>
    public void SetAddress(string house, string subPremises, string street, string town, string county, string country, string postcode)
    {
        Validator.ValidateProperty(house, new ValidationContext(this, null, null) { MemberName = "House" });
        Validator.ValidateProperty(street, new ValidationContext(this, null, null) { MemberName = "Street" });
        Validator.ValidateProperty(postcode, new ValidationContext(this, null, null) { MemberName = "Postcode" });

        House = house;
        SubPremises = subPremises;
        Street = street;
        Town = town;
        County = county;
        Country = country;
        Postcode = postcode;
    }


    /// <exception cref="ValidationException">Thrown when one of the fields doesn't match the business complexity rules</exception>
    public void SetAddress(Address newAddress)
    {
        this.SetAddress(newAddress.House, newAddress.SubPremises, newAddress.Street, newAddress.Town, newAddress.County, newAddress.Country, newAddress.Postcode);
    }


    public string FirstLineOfAddress
    {
        get
        {
            return String.Format("{0}{1}, {2}",
                                    (String.IsNullOrEmpty(this.SubPremises) ? "" : this.SubPremises),
                                    (String.IsNullOrEmpty(this.SubPremises) ? this.House : ", " + this.House),
                                    this.Street
                );
        }
    }

    public override string ToString()
    {
        return String.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}",
                                House,
                                SubPremises,
                                Street,
                                Town,
                                County,
                                Postcode,
                                Country);
    }

    public AddressDto ToAddressDto()
    {
        return new AddressDto { House = this.House, SubPremises = this.SubPremises, Street = this.Street,
                                    Town = this.Town, County = this.County, Country = this.Country, Postcode = this.Postcode };
    }

    public void DisableValidation()
    {
        TypeDescriptor.RemoveProviderTransparent(metadataAddress, typeof(Address));
    }
    #endregion

}

Для простоты предположим, что AddressMetadata в 'House' имеет атрибут [Required], хотя, очевидно, у меня также есть регулярные выражения для почтового индекса и т. д. и т. д.

Предположим, я работаю в той же сборке, поэтому внутренний модификатор не важен.

Теперь, если я позвоню:

Address stuff = new Address("", "", "", "", "", "", "");

, тогда проверказапускается (через SetAddress) вообще никаких проблем.

Если я сделаю:

Address stuff = new Address();
stuff.DisableValidation();
stuff.SetAddress("", "", "", "", "", "", "");

Я ожидаю, что проверка будет отключена.

Помогает ли это кому-либо предоставить большеинформация

...