Расширение LINQ до классов, сгенерированных SQL - PullRequest
0 голосов
/ 25 ноября 2011

Я выбрал LINQ to SQL в качестве платформы ORM для проекта ASP .NET MVC3.Все было хорошо, прежде чем я столкнулся с необходимостью добавить дополнительное поле «Подтверждение пароля» в регистрационную форму.Как было упомянуто в одном вопросе о SO (к сожалению, я не могу его найти в данный момент), лучше использовать интерфейс для расширения сгенерированных классов LINQ to 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 его вообще не имеет.Заранее спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Я знаю, что вы уже приняли ответ на этот вопрос, но я думаю, что может быть лучше настроить его, используя partial классы. Пока вы устанавливаете класс partial в том же namespace с тем же именем, все будет настроено автоматически. Вот пример того, как я настроил это в одном из моих проектов:

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
}

}

Вы можете настроить частичный класс как IValidatableObject, который реализует собственный метод Validate. Вы можете иметь чек для Confirm==Password в вашем методе Validate.

Вы можете получить больше информации в этом Pluralsight Video

1 голос
/ 25 ноября 2011

Если вы используете классы View Model, вам не нужна логика проверки, связанная с вашими классами DAL Model, поэтому вам не нужен интерфейс проверки, связанный с классом DAL Model.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...