2016-06-09 3 views
0

Я хотел бы сделать ограничение, которое обеспечит, что Beginning составляет менее End. Я использую Entity Framework, насколько я знаю, это невозможно сделать с помощью аннотаций. Можно ли это сделать в методе OnModelCreating?Ограничение порядка значений по времени и времени

public class Duty { 
     public int Id { get; set; } 
     public virtual Employee Employee { get; set; } 
     public virtual Store Store { get; set; } 
     public DateTime Beginning { get; set; } 
     public DateTime End { get; set; } 
    } 
+0

Почему бы не добавить это ограничение в SQL? –

+0

@ M.Suurland Я использую первое решение для кода, поэтому любое обновление базы данных основано на моем коде на C#. Опять же, насколько я знаю, есть два базовых решения: аннотации или Fluent API, и я думаю, что это может быть решено последним, но мне не хватает знаний в отделе Fluent API. – user6445699

+0

Любая удача, исследующая любой из нижеперечисленных методов? –

ответ

0

An answer for the same is here.

ИЛИ

Попробуйте исследовать FluentValidation.

Он использует свободный интерфейс и лямбда-выражения для построения правил валидации.

Из документации, вы можете включить его с помощью NuGet, как -

Install-Package FluentValidation 

Реализация ограничение так просто, как:

using FluentValidation; 

public class CustomerValidator: AbstractValidator<Customer> { 
    public CustomerValidator() { 
    RuleFor(customer => customer.Surname).NotEmpty(); 
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name"); 
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount); 
    RuleFor(customer => customer.Address).Length(20, 250); 
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode"); 
    } 

    private bool BeAValidPostcode(string postcode) { 
    // custom postcode validating logic goes here 
    } 
} 

Customer customer = new Customer(); 
CustomerValidator validator = new CustomerValidator(); 
ValidationResult results = validator.Validate(customer); 

bool validationSucceeded = results.IsValid; 
IList<ValidationFailure> failures = results.Errors; 

Попробуйте. (Я не настроил пример для ваших потребностей, вы, возможно, придется читать в глубине documentation here.)

2
public class SomeEntity 
    { 
     [MustBeLessThanDate(nameof(End))] 
     public DateTime Beginning { get; set; } 

     public DateTime End { get; set; } 
    } 

    public class MustBeLessThanDateAttribute : ValidationAttribute 
    { 
     private readonly string _otherPropertyName; 

     public MustBeLessThanDateAttribute(string otherPropertyName) 
     { 
      _otherPropertyName = otherPropertyName; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var containerType = validationContext.ObjectInstance.GetType(); 

      var field = containerType.GetProperty(_otherPropertyName); 

      var otherValue = (DateTime) field.GetValue(validationContext.ObjectInstance, null); 

      var thisValue = (DateTime) value; 

      return thisValue < otherValue 
       ? ValidationResult.Success 
       : new ValidationResult("Value is not less than other value"); 
     } 
    } 
+0

Это выглядит великолепно! Благодаря! – user6445699

+0

Это решение выглядит лучше всего для меня, но есть ли какие-либо преимущества по сравнению с решением Darshan Patel относительно сопоставления Entity Framework? – user6445699

+0

Darshan нарушает основные принципы того, что такое POCO, а также разделение проблем. Его код не подлежит вторичной переработке. Кроме того, если вы переключаете ORM, некоторые переопределяют получатели и сеттеры на POCO. –

0

Почему вы не используете состояние в вашей собственности. что-то вроде этого ....

public int Id { get; set; } 
public virtual Employee Employee { get; set; } 
public virtual Store Store { get; set; } 
public DateTime Beginning { get; set; } 

private DateTime _end; 
public DateTime End { 
    get 
    { 
     return _end; 
    } 
    set 
    { 
     if (value < Beginning) 
     { 
      throw new Exception("End date can not be less than beginning date."); 
     } 
     _end = value; 
    } 
} 

Но не забудьте назначить beginning date, прежде чем назначить end date

1

Вы можете использовать пользовательскую проверку, наследованием от класса ValidationAttribute, который имеет IsValid метод которые вы можете переопределить. Вы можете создать этот класс в своем представленииModel, а затем применить созданный атрибут в своем enddate.

Смежные вопросы