【问题标题】:Extending LINQ to SQL generated classes扩展 LINQ to SQL 生成的类
【发布时间】:2011-11-28 07:36:21
【问题描述】:

我选择了 LINQ to SQL 作为 ASP .NET MVC3 项目的 ORM 框架。在我需要在注册表单上添加额外的字段“确认密码”之前,一切都很好。正如在关于 SO 的一个问题中提到的那样(不幸的是,我目前找不到它),最好使用接口将生成的 LINQ 扩展到具有验证属性的 SQL 类,而不是使用另一个类来存储验证属性。所以我们开始:

public interface IRegTry
    {
        [Required]
        [Email]
        string EMail { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "Should not exceed 100 symbols")]
        string FirstName { get; set; }

        [Required]        
        string Password { get; set; }        

    }

    [MetadataType(typeof(IRegTry))]
    public partial class RegTry : IRegTry { }

RegTry类是LINQ to SQL基于数据库实体生成的类。

在视图中我们有确认密码字段,它应该确保两个输入的密码彼此相等。

所以我们在这里添加它:

public class RegTryViewModel : RegTry
{
    [Required]
    [EqualTo("Password", ErrorMessage = "You should type two identical passwords to continue")]
    public string ConfirmPassword { get; set; }
}

视图是具有RegTryViewModel 模型的强类型视图。

我只是在这里要求确保我做的一切都是正确的。让我感到不舒服的是,我在IRegTry 接口和RegTryViewModel 类之间传播了验证逻辑。但是我不能将ConfirmPassword 属性添加到IRegTry 接口,因为基本SQL 到LINQ 类根本没有它。 提前谢谢各位!

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc linq-to-sql


    【解决方案1】:

    我知道您已经接受了这个问题的答案,但我认为使用 partial 类进行设置可能会更好。只要您在同一个namespace 中设置partial 类,名称相同,一切都会自动设置。以下是我如何在我的一个项目中进行设置的示例:

    namespace OperationsMetrics
    {
    [MetadataType(typeof(ClientStatMD))]
    public partial class client_wkly_stat : IValidatableObject
    {
        public class ClientStatMD
        {
            [Required(ErrorMessage = "Client selection is required")]
            public virtual int client_id { get; set; }
            [Required(ErrorMessage = "SLAs met is required")]
            public virtual int wkly_sla_met { get; set; }
            [Required(ErrorMessage = "Total SLAs possible is required")]
            public virtual int wkly_sla_req { get; set; }
            [Required(ErrorMessage = "Number of input files is received")]
            public virtual int num_inp_files_rec { get; set; }
            [Required]
            public string client_name { get; set; } 
    
        }
    
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (wkly_sla_met > wkly_sla_req)
            {
                yield return new ValidationResult("SLAs met cannot be greater that SLAs possible");
            }
    
    
        }
        public string client_name { get; set; } //this isn't a part of the actual db object but can still be accessed in the Validate method
    }
    

    }

    您可以将 Partial Class 设置为 IValidatableObject,它实现了自己的 Validate 方法。您可以在 Validate 方法中检查 Confirm==Password

    你可以在这个Pluralsight Video获得更多信息

    【讨论】:

    • PluralSight 链接已损坏,如果有效链接可用,请更新
    【解决方案2】:

    如果您使用的是视图模型类,则不需要将验证逻辑连接到 DAL 模型类,因此您不需要将验证接口链接到 DAL 模型类。

    【讨论】:

    • 但是如果我仍然需要接口来进行单元测试,我应该怎么做呢?
    • 我仍然会保持验证逻辑只与验证类连接;如果您不将 DAL 类传递到模型绑定器或从模型绑定器传递它们,则 DAL 类不需要任何验证逻辑。
    • 好的,我明白了。你能给我提供代码示例吗?我有点沮丧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2010-11-29
    相关资源
    最近更新 更多