日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第一百五十二期:白话Entity Framework Core数据验证

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一百五十二期:白话Entity Framework Core数据验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據驗證是每個項目必須存在的,可以防止不符合系統規范的數據進入系統進而導致系統不穩定甚至崩潰。我們可以自己編寫代碼進行驗證,但是這樣一方面代碼量較大,另一方面有可能驗證代碼覆蓋不完全。但是在 Entity Framework Core (以下簡稱 EF Core )中這些問題全可以解決。

作者:朱鋼

數據驗證是每個項目必須存在的,可以防止不符合系統規范的數據進入系統進而導致系統不穩定甚至崩潰。我們可以自己編寫代碼(包括前臺和后臺代碼)進行驗證,但是這樣一方面代碼量較大,另一方面有可能驗證代碼覆蓋不完全。但是在 Entity Framework Core (以下簡稱 EF Core )中這些問題全可以解決。在 EF Core 中有兩種驗證模式,分別是內置模型驗證和第三方擴展模型驗證。下面我分別對這兩種模式進行講解,在講解前我們先來創建必須的模型。

public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }

一、內置模型驗證

在 EF Core 中并沒有 Fluent API 模式對數據進行驗證,因此我們只能通過 Data Annotations (數據注解)方式來進行數據驗證,也就是添加特性的方法來驗證數據。例如我們要驗證 User 模型中的 Name 的長度,Name 長度不能大于 5 ,我們只需在 Name 屬性上增加 StringLength 數據注解即可, StringLength 位于命名空間 System.ComponentModel.DataAnnotations 中,修改 User 模型代碼如下:

public class User { public int Id { get; set; } [StringLength(5)] public string Name { get; set; } public int Age { get; set; } }

上述代碼通過 StringLength(5) 數據注解將 Name 屬性的數據長度限定在 5 ,并且在數據提交時按照這個約定進行數據驗證。下面我們就通過數據注解中的驗證器來驗證剛才添加的特性。首先我們要創建一個上下文的擴展方法:

public static List<ValidationResult> ExecuteValidation(DbContext context) { List<ValidationResult> result = new List<ValidationResult>(); var models = context.ChangeTracker.Entries() .Where(p => (p.State == EntityState.Added) || (p.State == EntityState.Modified)); foreach (var model in models) { var entity = model.Entity; var valProvider = new ValidationDbContextServiceProvider(context); var valContext = new ValidationContext(entity, valProvider, null); List<ValidationResult> error = new List<ValidationResult>(); if(!Validator.TryValidateObject(entity,valContext,error,true)) { result.AddRange(error); } return result.ToList(); } }

在上述代碼中我們通過 ChangeTracker 方法找出被追蹤的實體,然后過濾出需要添加和更新的實體,對這些實體進行數據驗證。最后我們通過 Validator 中的 TryValidateObject 方法驗證實體數據并返回校驗錯誤信息。在業務代碼中我們調用前面定義的 ExecuteValidation 方法進行驗證,如果驗證通過就調用 EF Core 的 SaveChange() 方法,如果未通過就調用相應的處理代碼,代碼片段如下:

if(context.ExecuteValidation().Any()) { foreach(var error in context.ExecuteValidation()) { //處理代碼 } } else { context.SaveChange(); }

講到這里估計會有很多小伙伴說每個業務代碼中都要這么寫太麻煩了,而且也產生了大量的重復代碼。那么重復代碼這個問題該怎么解決呢?這時一定有部分小伙伴想到了通過重寫 SaveChanges 方法,將驗證代碼加入到這個方法中,這樣就可以解決剛才的那個問題,達到一勞永逸的效果。具體代碼如下:

public override int SaveChanges(bool acceptAllChangesOnSucces) { var provider = ((IInfrastructure<IServiceProvider>)this).Instance; var items = new Dictionary<object, object>(); var models = this.ChangeTracker.Entries() .Where( p => (p.State == EntityState.Added)||(p.State==EntityState.Modified)); foreach (var model in models) { var entity = model.Entity; var context = new ValidationContext(entity, provider, items); List<ValidationResult> results = new List<ValidationResult>(); if(!Validator.TryValidateObject(entity,context,results,true)) { foreach (var result in results) { if(result!=ValidationResult.Success) { throw new ValidationException(result.ErrorMessage); } } } } return base.SaveChanges(); }

通過上述代碼就可以一處編寫驗證,多處使用了。具體的思路和前面所講的一樣,這里就不再進行講解了。

二、第三方擴展模型驗證

前面所講的是通過數據注解的方式來進行數據驗證的,但是如果是使用 Fluent API 的方式就沒辦法解決文章開頭所說的問題,因為Fluent API 模式并沒有提供對數據模型的驗證。這時我們可以使用第三方擴展,在 EF Core 中常用的模型數據驗證第三方擴展是 FluentValidation.AspNetCore 。在使用前我們需要在 NuGet 中下載此擴展。 FluentValidation.AspNetCore 安裝完成后我們需要為模型創建驗證器,驗證器是一個繼承自 AbstractValidator<T> 的類,驗證規則使用 RuleFor 方法定義在驗證器構造函數中。代碼如下:

public class ModelValidator:AbstractValidator<User> { public ModelValidator() { RuleFor(p => p.Name).NotEmpty().WithMessage("姓名不能為空"); RuleFor(p => p.Name).MaximumLength(5).WithMessage("姓名長度在5字節"); } }

上述代碼進行了兩個驗證,一個是驗證 Name 字段是否為空,另一個是驗證 Name 字段的長度,其中我們通過 MaximumLength 規定了 Name 字段的最長長度為 5 字節。之后我們通過 WithMessage 方法返回我們自定義的錯誤信息。 我們定義完驗證規則后下一步就是將我們定義的驗證規則與應用程序連接起來,這里我們需要用到 AddFluentValidation 來注入,例如在 Asp.Net Core 程序中我們將注入程序寫入 Startup 的 ConfigureServices 方法里。我們調用 AddFluentValidation 方法會將 FluentValidation 服務添加到 Asp.Net Core 中,然后使用 RegisterValidatorsFromAssembly 方法將自定義的驗證代碼注入到容器中,代碼段如下:

public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddFluentValidation(p=> p.RegisterValidatorsFromAssemblyContaining<Startup>()); }

在需要驗證數據的地方我們通過 ModelState 獲取驗證狀態,驗證通過就執行后續代碼,不通過就執行處理代碼。示例代碼如下:

if(ModelState.IsValid) { //后續代碼 } else { //驗證不通過處理代碼 }

這里有一點需要注意,當傳遞的實體為 null 時,將返回錯誤信息,這是因為 AbstractValidator 中存在 EnsureInstanceNotNull 方法,這個方法在實例為 null 時會拋出異常,即使重寫該方法也無法返回自定義的錯誤信息。如果需要驗證實體集合就需要使用 RuleForEach 方法即可,對于自定義驗證規則則可使用 SetValidator 方法。

三、總結

本篇文章講解了 EF Core 數據驗證的方法,雖然講的是 EF Core 的方法,但是同樣也適用于 EF6 ,這些內容是常用的,上述部分代碼可以在大部分項目中通用。

閱讀目錄(置頂)(長期更新計算機領域知識)

閱讀目錄(置頂)(長期更新計算機領域知識)

閱讀目錄(置頂)(長期科技領域知識)

歌謠帶你看java面試題

總結

以上是生活随笔為你收集整理的第一百五十二期:白话Entity Framework Core数据验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕亚洲第一 | 国产午夜网站 | 黄视频免费看在线 | 午夜福利电影一区二区 | 美女看片 | 爱啪啪影视 | 免费成人在线视频观看 | 午夜美女在线 | 成人性爱视频在线观看 | 嫩草影院中文字幕 | japanese国产在线观看 | 麻豆区1免费 | 天天操人人 | 综合久久av| 免费av网站在线播放 | 日韩在线观看网址 | 男人的天堂免费 | 国产一区二区三区在线免费观看 | 国产麻豆视频 | 一级黄色片一级黄色片 | 男女午夜激情视频 | 亚洲精品久久久久久动漫器材一区 | 国产午夜精品久久久久 | 邪恶久久 | 色综网| 中文字幕第一页在线 | 国产精品一二三四五区 | 91在线网站| 午夜在线| a级片免费看 | 三级视频在线 | 精品人妻一区二区三区久久夜夜嗨 | 久久桃色 | a级片免费观看 | 性生交大片免费看狂欲 | 夜夜嗨一区二区三区 | 欧美精品免费看 | ass东方小嫩模pics | 久久久久久久久久久久Av | 善良的女邻居在线观看 | 日韩一区二区高清 | 色欲人妻综合网 | 亚州国产精品 | 欧美最猛性xxxxx(亚洲精品) | 99er这里只有精品 | 日本a天堂 | 日本免费黄色网 | 男人私人影院 | 午夜精品国产精品大乳美女 | 国产精品网站在线 | 深夜福利一区二区三区 | 天天综合色网 | 中文字幕五区 | 在线看的av网站 | 国产不卡二区 | 国产农村妇女毛片精品久久麻豆 | 国产一区亚洲二区三区 | 又色又爽又黄18网站 | 一区二区欧美日韩 | 国产日韩欧美日韩大片 | 亚洲av永久无码精品一百度影院 | 久久电影一区 | 91av短视频| 麻豆午夜视频 | 国产精品性色 | 日本三级精品 | 日韩视频在线观看视频 | 日韩91av | 18av视频 | 黄色网在线| 香蕉一级片 | 邻居少妇张开腿让我爽了在线观看 | 最近最经典中文mv字幕 | 精品日韩中文字幕 | av夜色 | 国产剧情一区二区三区 | 中文字幕乱码一区二区 | av网址在线| 欧美日韩亚洲国产另类 | 国产欧美精品在线 | 成年人国产精品 | 看免费一级片 | 天天射天天干天天 | 每日更新在线观看av | 欧美福利视频在线观看 | 国产福利小视频在线 | 久久久久性 | ww欧美| 综合av一区 | 男女免费网站 | 日韩精品视频在线观看免费 | 久久久久久少妇 | 国产女主播一区二区三区 | 女生喷液视频 | 特级丰满少妇一级aaa爱毛片 | www久久久久久久 | 人人干美女 | 一区二区 中文字幕 | 搞黄网站在线观看 |