Как добавить проверку в мои классы POCO (шаблон) - PullRequest
13 голосов
/ 26 февраля 2011

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

Ответы [ 3 ]

23 голосов
/ 26 февраля 2011

Вы не можете добавить его напрямую (если не измените шаблон 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 вы должны использовать специализированную модель представления для каждого представления и передачи данных, которые вам нужны, поэтому атрибуты проверки будут помещены в класс модели представления.

0 голосов
/ 11 мая 2011

Далее подробно остановимся на ответе.С помощью блока валидации 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;
    }
}
0 голосов
/ 26 февраля 2011

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

...