如何为我的POCO(模板)类添加验证

13

我使用了这个教程生成我的Poco类,它们将用于整个应用程序..问题是我不应该修改生成的cs文件,因为它们会自动生成...我怎么添加像[Required]这样的属性?请帮忙

3个回答

23

你不能直接添加它(除非你修改T4模板让它为你创建),但是你可以尝试使用ASP.NET动态数据中引入的技巧。所有POCO类都被定义为partial,因此让我们定义你的partial部分:

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中,您应该为每个视图使用专门的视图模型,并传递所需的数据,以便将验证属性放置在视图模型类中。


3
如果您给我点踩,能否告诉我原因?如果我的回答有误,我会进行修改或删除…… - Ladislav Mrnka
1
倡导元数据伙伴类是在倡导一种不好的实践。 - John Farrell
4
@jfar:好的。你读了最后一段吗? :) 我总是尽力回答问题,并提供最佳实践,即使我不同意解决方案。 - Ladislav Mrnka
2
@jfar:你应该去踩一下微软,因为EF Code First在POCO实体上引入了DataAnnotations作为常见场景:http://blogs.msdn.com/b/adonet/archive/2010/12/15/ef-feature-ctp5-validation.aspx 开个玩笑,我理解你的担忧。 - Ladislav Mrnka
2
@jfar,为什么你这么讨厌那些DataAnnotation属性?当然,在实体类中它们没有用武之地,但是它们在ViewModels中的表现相当不错。 - Vasiliy R
显示剩余4条评论

0
进一步扩展答案。通过使用微软模式和实践企业库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
生成的 POCO 类的属性是从模型实体上的 facets 推导出来的。例如,对于 [Required],请确保字段为 "not null",而对于 [StringLength(n)],请通过 MaxLength facet 确保数据类型为 nvarchar(n)

这些属性是由EF生成的吗?还是必须找到一种方法将它们添加到POCO类中? - polkduran
如果模型上有facets,EF在生成POCO时会添加相应的属性。因此,要强制特定属性,您需要知道如何调整模型。 - Brian Kretzler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接