برای درک بهتر موضوع به ساختار کلاسهای اعتبارسنجی در تصویر بعدی دقت کنید.
- اعتبار سنجی در چه قسمت هایی اتفاق میافتد:
1.Property
2.Entity
3.Context
[Required(ErrorMessage = "لطفا نام نویسنده را مشخص نمائید")] public string AuthorName { set; get; } [StringLength(100,MinimumLength=3,ErrorMessage="حداقل سه حرف و حداکثر 100 حرف وارد نمایید.")] public string AuthorName { set; get; }
Validation Attributes AssemblySystem.ComponentModel.DataAnnotations.dll NamespaceSystem.ComponentModel.DataAnnotations StringLength RegularExpression DataType Required Range CustomValidation
Mapping Attributes AssemblyEntityFramework.dll NamespaceSystem.ComponentModel.DataAnnotations Key Column,Table ComplexType ConCurrency TimeStamp DatabaseGenerated ForeignKey InverseProperty MaxLength MinLength NotMapped
public class Blog : IValidatableObject { public int blogID { set; get; } [Required(ErrorMessage = "لطفا عنوان وبلاگ را مشخص نمائید")] public string Title { set; get; } [Required(ErrorMessage = "لطفا نام نویسنده را مشخص نمائید")] [StringLength(100,MinimumLength=3,ErrorMessage="حداقل سه حرف و حداکثر 100 حرف وارد نمایید.")] public string AuthorName { set; get; } public IEnumerable<ValidationResult> Validate(ValidationContext ValidationContext) { if (this.AuthorName =="بدون نام") yield return new ValidationResult ("این نام برای نام نویسنده مجاز نمیباشد.", new[] { "AuthorName"}); if (this.AuthorName == this.Title) yield return new ValidationResult (" نام نویسنده وبلاگ و عنوان وبلاگ نمیتواند همسان باشد.!", new[] { "AuthorName", "Title" }); } }
نکته: در بررسی هم نام بودن نام نویسنده و نام وبلاگ هردو خاصیت ("AuthorName", "Title") رو درج کردیم اینکار باعث ایجاد دو خطای اعتبارسنجی میشود.
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, System.Collections.Generic.IDictionary<object, object> items) { return base.ValidateEntity(entityEntry, items); }
نحوه فراخوانی اعتبار سنجی ها:
// اعتبار سنجی یک خاصیت ICollection<DbValidationError> ValidationProperty = Context.Entry(Blog).Property(p => p.AuthorName).GetValidationErrors(); // اعتبار سنجی یک موجودیت DbEntityValidationResult ValidationEntity = Context.Entry(Blog).GetValidationResult(); // اعتبار سنجی همه موجودیتها IEnumerable<DbEntityValidationResult> ValidationContext = Context.GetValidationErrors();
نکته : در اعتبار سنجی Context بصورت پیش فرض فقط موجودیتهای جدید و یا تغییر یافته اعتبار سنجی میشوند.
EntityState.Added || EntityState.Modified
ترتیب فراخوانی اعتبار سنجیها :
- اعتبار سنجی چند زبانی رو چگونه تعریف کنیم؟
- متد GetValidationErrors() رو در الگوی Repository , UOW چگونه پیاده سازی کنیم؟
- آیا اعتبار سنجی در کنار موجودیتها از نظر معماری چند لایه کار درستی میباشد؟