2012-11-15 37 views
15

Tôi có Danh mục mô hình có trường Tên và mọi tên danh mục phải là duy nhất. Tôi đã thực hiện xác nhận và nó hoạt động khi tôi cố gắng tạo Danh mục mới nhưng tôi gặp sự cố khi cố gắng chỉnh sửa nó. Bây giờ nó chỉ kiểm tra nếu tên tồn tại và tất nhiên nó làm khi tôi cố gắng chỉnh sửa cùng một loại.FluentValidation xác nhận tên duy nhất bằng cách sử dụng cơ sở dữ liệu

Mẫu

[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; 
    } 
} 

Như bạn có thể thấy tôi có UniqueName(string name) chức năng, nhưng làm thế nào tôi có thể vượt qua ID, hoặc toàn bộ mô hình trong đó vì vậy tôi có thể kiểm tra nếu nó cùng id như mô hình tôi đang cố gắng để chỉnh sửa sau đó nó vượt qua. Làm thế nào tôi có thể vượt qua một cái gì đó như UniqueName(string name, int? id)? Tôi đã phát hiện ra FluentValidation chỉ hôm nay và tôi không thể tìm ra.

Trả lời

20

Predicate Validator (aka Must) có quá tải, chấp nhận biến vị ngữ với hai tham số (đối tượng được xác thực và giá trị thuộc tính). Trong trường hợp vị ngữ của bạn sẽ có loại Func<Category, string, bool>. Vì vậy, chỉ cần thêm thông số Category vào phương thức xác thực tên duy nhất của bạn:

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

Cảm ơn, hiện đang làm việc. – sed

+1

lưu ý phụ: bạn nên vứt bỏ DbContext ngay khi bạn hoàn thành nó, vì vậy "sử dụng (var _db = new ProjecteDataContext())" –

Các vấn đề liên quan