【问题标题】:How to add validation to my POCO(template) classes如何向我的 POCO(模板)类添加验证
【发布时间】:2011-07-04 22:32:33
【问题描述】:

所以我使用this 教程来生成我的 poco 类,我将在整个应用程序中使用这些类。问题是我不应该修改生成的 cs 文件,因为它们会自动重新生成……如何添加属性像[必需]之类的东西?请帮忙

【问题讨论】:

    标签: asp.net asp.net-mvc validation entity-framework-4 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 中,您应该为每个视图使用专门的视图模型并传递您需要的数据,以便将验证属性放置在视图模型类中。

    【讨论】:

    • 如果您投反对票,最好告诉我为什么?如果我的回答不正确,我会修改或删除它...
    • 提倡元数据伙伴课程是一种不好的做法。
    • @jfar:好的。你读过最后一段吗? :) 如果我不同意解决方案,我一直在尝试回答问题并提供最佳实践。
    • @jfar:您也应该对 MS 投反对票,因为 EF Code First 在 POCO 实体上引入了 DataAnnotations 作为常见场景:blogs.msdn.com/b/adonet/archive/2010/12/15/… 开个玩笑。我理解您的担忧。
    • @jfar,你为什么这么讨厌那些 DataAnnotation 属性?当然,Entity 类中没有它们的位置,但它们与 ViewModel 配合得很好。
    【解决方案2】:

    生成的 POCO 上的属性源自模型中实体的方面。例如对于[Required],确保该字段为“非空”,对于[StringLength(n)],通过MaxLength facet 确保数据类型为nvarchar(n)

    【讨论】:

    • 那些属性是EF生成的?还是必须想办法将它们添加到 POCO 类中?
    • 如果分面在模型上,EF 将在生成 POCO 时添加适当的属性。所以要强制一个特定的属性,你需要知道如何调整模型。
    【解决方案3】:

    进一步扩展答案。通过使用 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多