Поэтому я использовал этот учебник для создания моих классов poco, которые я должен использовать во всех своих приложениях. Проблема в том, что Im не должен изменить сгенерированные файлы cs, потому что они автоматически генерируются... Как добавить атрибуты, такие как [Обязательно] и прочее подобное? пожалуйста, помогите
Как добавить проверку на мои классы POCO (шаблон)
Ответ 1
Вы не можете добавить его напрямую (если вы не измените шаблон 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 вы должны использовать специализированную модель просмотра для каждого представления и передавать необходимые данные, чтобы атрибуты проверки были помещены в класс модели вида.
Ответ 2
Атрибуты сгенерированных POCO получены из граней объектов в модели. например для [Required]
убедитесь, что поле "не равно нулю", а для [StringLength(n)]
убедитесь, что тип данных nvarchar(n)
через грань MaxLength
.
Ответ 3
Дальнейшее расширение ответа. Используя блок валидации Microsoft Patterns and 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;
}
}