Как добавить проверку в мои классы POCO(шаблон)

Поэтому я использовал этот учебник для генерации своих классов poco, которые я буду использовать на протяжении всей моей заявки... проблема в том, что я не должен изменять сгенерированные cs-файлы, потому что они автоматически регенерируются... Как мне добавить такие атрибуты, как [Required] и вроде того?? пожалуйста помоги

3 ответа

Решение

Вы не можете добавить его напрямую (если не измените шаблон T4, чтобы создать их для вас), но вы можете попробовать использовать трюк, представленный в динамических данных ASP.NET. Все классы POCO определены как частичные. Итак, давайте определим вашу частичную часть:

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(MyClassMetadata))]
public partial class MyClass
{
  private class MyClassMetadata
  {
     [Required]
     public object Id;

     [Required]
     [StringLength(100)]
     public object Name;
  }
}

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

В любом случае в ASP.NET MVC следует использовать специализированную модель представления для каждого представления и передавать необходимые данные, чтобы атрибуты проверки были помещены в класс модели представления.

Далее уточняю ответ. С помощью блока валидации Microsoft Patterns & Practices Enterprise Library 5 вы можете открыть множество возможностей для проверки, помимо тех, которые доступны в обычных аннотациях данных.

using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

[HasSelfValidation]
public partial class Category : ICategory
{
    [SelfValidation]
    public void Validate(ValidationResults validationResults)
    {
        if (this.Title === "Credo")
        {
            validationResults.AddResult(
                new ValidationResult(
                    "Category title cannot be a veiled reference to a former cool 2000AD character.",
                    this,
                    null,
                    null,
                    null));
        }

        validationResults.AddAllResults(
            ValidationFactory
            .CreateValidator<ICategory>()
            .Validate(this));
    }
}

using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

public interface ICategory
{
    int Id
    {
        get; 
        set;
    }

    [Required]
    [StringLengthValidator(1, 50, MessageTemplate = "Category title should be a maximum of 50 characters in length.")]
    string Title
    {
        get; 
        set;
    }
}

Атрибуты сгенерированных POCO получены из аспектов на объектах в модели. например для [Required] убедитесь, что поле "не равно нулю" и для [StringLength(n)] убедитесь, что тип данных nvarchar(n) через MaxLength фаска.

Другие вопросы по тегам