2012-11-15 14 views
15

Posiadam model kategorii, który ma pole Nazwa, a każda nazwa kategorii musi być unikalna. Dokonałem sprawdzania poprawności i działa, gdy próbuję utworzyć nową kategorię, ale mam problem podczas próby jej edycji. Na razie wystarczy sprawdzić, czy nazwa istnieje i oczywiście robi to, gdy próbuję edytować tę samą kategorię.Walidacja unikalnej nazwy FluentValidation przy użyciu bazy danych

model

[Validator(typeof(CategoryValidator))] 
public class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    virtual public ICollection<Image> Images { get; set; } 
} 

public class CategoryValidator : AbstractValidator<Category> 
{ 
    public CategoryValidator() 
    { 
     RuleFor(x => x.Name).NotEmpty().WithMessage("Category name is required.").Must(UniqueName).WithMessage("This category name already exists."); 
    } 

    private bool UniqueName(string name) 
    { 
     ProjecteDataContext _db = new ProjecteDataContext(); 
     var category = _db.Categories.Where(x => x.Name.ToLower() == name.ToLower()).SingleOrDefault(); 

     if (category == null) return true; 
     return false; 
    } 
} 

Jak widać mam UniqueName(string name) funkcję, ale w jaki sposób można przekazać identyfikator lub cały model w nim więc mogę sprawdzić, czy jest to ten sam identyfikator jako modelu Próbuję edytować następnie to mija. Jak mogę przekazać coś takiego, jak UniqueName(string name, int? id)? Odkryłem FluentValidation tylko dzisiaj i nie mogę dojść do tego.

Odpowiedz

20

Predicate Validator (aka Must) ma przeciążenie, które akceptuje predykat z dwoma parametrami (zwalidowany obiekt i wartość właściwości). W twoim przypadku predykat będzie miał typ Func<Category, string, bool>. Dodaj parametr Category do unikatowej metody sprawdzania poprawności nazwy:

private bool UniqueName(Category category, string name) 
{ 
     ProjecteDataContext _db = new ProjecteDataContext(); 
     var dbCategory = _db.Categories 
          .Where(x => x.Name.ToLower() == name.ToLower()) 
          .SingleOrDefault(); 

     if (dbCategory == null) 
      return true; 

     return dbCategory.ID == category.ID; 
} 
+0

Dzięki, pracuję teraz. – sed

+1

side note: powinieneś pozbyć się DbContext, gdy tylko skończysz, więc "using (var _db = new ProjecteDataContext())" –

Powiązane problemy