簡體   English   中英

將LINQ擴展為SQL生成的類

[英]Extending LINQ to SQL generated classes

我已經選擇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生成的類。

在View上我們確認了密碼字段,這應該確保兩個鍵入的密碼彼此相等。

所以在這里我們添加它:

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

View是使用RegTryViewModel模型的強類型視圖。

我只是在這里問我要確保我做的一切都是對的。 讓我感到不舒服的是我在IRegTry接口和RegTryViewModel類之間傳播驗證邏輯。 但我不能將ConfirmPassword屬性添加到IRegTry接口,因為基本SQL到LINQ類根本沒有它。 先謝謝你們!

如果您使用的是View Model類,則不需要連接到DAL Model類的驗證邏輯,因此您不需要將該驗證接口鏈接到DAL Model類。

我知道你已經接受了這個答案,但我認為最好使用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方法。 您可以在驗證方法中檢查Confirm==Password

您可以在此Pluralsight視頻中獲得更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM