【发布时间】:2011-07-04 22:32:33
【问题描述】:
所以我使用this 教程来生成我的 poco 类,我将在整个应用程序中使用这些类。问题是我不应该修改生成的 cs 文件,因为它们会自动重新生成……如何添加属性像[必需]之类的东西?请帮忙
【问题讨论】:
标签: asp.net asp.net-mvc validation entity-framework-4 poco
所以我使用this 教程来生成我的 poco 类,我将在整个应用程序中使用这些类。问题是我不应该修改生成的 cs 文件,因为它们会自动重新生成……如何添加属性像[必需]之类的东西?请帮忙
【问题讨论】:
标签: asp.net asp.net-mvc validation entity-framework-4 poco
您不能直接添加它(除非您修改 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 中,您应该为每个视图使用专门的视图模型并传递您需要的数据,以便将验证属性放置在视图模型类中。
【讨论】:
生成的 POCO 上的属性源自模型中实体的方面。例如对于[Required],确保该字段为“非空”,对于[StringLength(n)],通过MaxLength facet 确保数据类型为nvarchar(n)。
【讨论】:
进一步扩展答案。通过使用 Microsoft Patterns & Practices Enterprise Library 5 Validation Block,您可以打开大量验证可能性,而不仅仅是通过普通数据注释获得的可能性。
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;
}
}
【讨论】: