日韩性视频-久久久蜜桃-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数据验证的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产一区二区电影 | 777777av| 欧美一级一片 | 91在线影院| 91麻豆精品国产午夜天堂 | 亚洲精品在线免费播放 | 黄色av免费在线看 | 欧美激情一区二区三区在线 | 日本在线观看一区二区三区 | 91沈先生在线 | 九七av| 黄色日批视频 | 午夜精品少妇 | 欧美日韩a级 | 亚洲免费中文字幕 | 少女国产免费观看 | k8经典成人理伦片 | 18欧美性xxxx极品hd | 67194av| 天天干天天色 | 91欧美国产 | 加勒比一区在线 | 一级片在线播放 | 久久久国产成人一区二区三区 | 亚洲欧美国产日韩精品 | 一区二区三区国产在线观看 | 日韩欧美中文在线 | 日本福利一区二区 | 亚洲a人| 亚洲欧美一区二区三区久久 | 影音先锋二区 | 日本精品一区二区三区四区的功能 | 在线观看黄色片 | 亚洲成熟丰满熟妇高潮xxxxx | 亚洲欧美一级 | 成人午夜福利一区二区 | 伊人春色网 | 九九热九九 | 日本天堂一区 | 色射视频| 麻豆国产网站 | 亚洲一区二区三区在线观看视频 | 亚洲精品国产精品乱码不99热 | 日本少妇xxxx软件 | 高清av网址 | 又色又爽又高潮免费视频国产 | 亚洲国产精品无码久久 | 欧美三个黑人玩3p | 黄色片网站视频 | 精品一级少妇久久久久久久 | 色中色av| 国产后入又长又硬 | 久久久久99精品成人片直播 | 男女做的视频 | 91网在线看 | 亚洲精品中文字幕乱码三区 | 中文字幕一区二区在线观看 | 一区精品视频在线观看 | 求欧美精品网址 | 国产精品麻豆入口 | 成人欧美一区二区三区黑人孕妇 | 天天操网 | 免费看av在线 | 涩涩屋视频 | 欧美日韩成人在线观看 | 久久久久久久久久久久久久久久久久久久 | 国产乱码77777777 | 波多野 在线 | av在线资源观看 | 国语对白做受xxxxx在线中国 | 久久免费观看视频 | 国产成人a亚洲精品 | 亚洲日本成人 | 91成人免费在线观看视频 | 成年人免费看视频 | 五个女闺蜜把我玩到尿失禁 | 色婷婷av一区二区三区四区 | 日韩欧美高清片 | 91中文| 中文字幕在线观看不卡 | 免费毛片一区二区三区 | 性色欲情网站iwww九文堂 | 全黄一级片 | 中文字幕一区二区三区夫目前犯 | 色峰视频 | 亚洲无码精品免费 | 成人做受视频试看60秒 | 一本大道综合伊人精品热热 | 一区二区三区美女视频 | 寂寞少妇让水电工爽hd | 欧美aaa级| 日本aa大片 | av第一区| 国产精品久久久久久久 | 五月婷婷av| 国产最新在线观看 | 丝袜老师扒开让我了一夜漫画 | 欧美日韩网站 | 海量av资源|