精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

.NET之生成數據庫全流程

運維 數據庫運維
本文主要是回顧下從項目創建到生成數據到數據庫(代碼優先)的全部過程。采用EFCore作為ORM框架。

[[398365]]

本文轉載自微信公眾號「鵬祥」,作者AZRNG。轉載本文請聯系鵬祥公眾號。

開篇語

本文主要是回顧下從項目創建到生成數據到數據庫(代碼優先)的全部過程。采用EFCore作為ORM框架。

本次示例環境:vs2019、net5、mysql

創建項目

本次事例代碼是用過vs2019創建的ASP.NET Core Web API項目

可以通過可視化界面創建或者通過命令行創建

  1. dotnet new webapi -o Net5ByDocker 

創建實體類

安裝連接MySQL數據庫組件

  1. <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0" /> 
  2.     <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Json.Newtonsoft" Version="5.0.0" /> 

增加實體類

  1. [Table("user")] 
  2.   public class User 
  3.   { 
  4.       public User() 
  5.       { 
  6.           Id = Guid.NewGuid().ToString(); 
  7.       } 
  8.  
  9.       public User(string account, string password, string creater) : this() 
  10.       { 
  11.           Account = account; 
  12.           Password = password
  13.           Deleted = false
  14.           SetCreater(creater); 
  15.       } 
  16.  
  17.       [Key
  18.       [Comment("主鍵")] 
  19.       [StringLength(36)] 
  20.       [Required] 
  21.       public string Id { get; private set; } 
  22.  
  23.       [Comment("帳號")] 
  24.       [StringLength(36)] 
  25.       [Required] 
  26.       public string Account { get; private set; } 
  27.  
  28.       [Comment("密碼")] 
  29.       [StringLength(36)] 
  30.       [Required] 
  31.       public string Password { get; private set; } 
  32.  
  33.       [Comment("余額")] 
  34.       [Column(TypeName = "decimal(18, 2)")] 
  35.       [Required] 
  36.       public decimal Money { get; set; } 
  37.  
  38.       [Comment("是否刪除")] 
  39.       [Column(TypeName = "tinyint(1)")] 
  40.       [Required] 
  41.       public bool Deleted { get; private set; } 
  42.  
  43.       [Comment("創建人")] 
  44.       [StringLength(20)] 
  45.       [Required] 
  46.       public string Creater { get; private set; } 
  47.  
  48.       [Comment("創建時間")] 
  49.       [Required] 
  50.       public DateTime CreateTime { get; private set; } 
  51.  
  52.       [Comment("修改人")] 
  53.       [StringLength(20)] 
  54.       [Required] 
  55.       public string Modifyer { get; private set; } 
  56.  
  57.       [Comment("修改時間")] 
  58.       [Required] 
  59.       public DateTime ModifyTime { get; private set; } 
  60.  
  61.       public void SetCreater(string name
  62.       { 
  63.           Creater = name
  64.           CreateTime = DateTime.Now; 
  65.           SetModifyer(name); 
  66.       } 
  67.  
  68.       public void SetModifyer(string name
  69.       { 
  70.           Modifyer = name
  71.           ModifyTime = DateTime.Now; 
  72.       } 
  73.   } 

這種只是增加實體類類型的一種方式,可能這種看著比較亂,還可以通過OnModelCreating實現,詳情看參考文檔

增加數據庫上下文OpenDbContext

  1. public class OpenDbContext : DbContext 
  2.     { 
  3.         public OpenDbContext(DbContextOptions<OpenDbContext> options) 
  4.             : base(options) 
  5.         { 
  6.         } 
  7.  
  8.         public DbSet<User> Users { get; set; } 
  9.     } 

Startup注入連接數據庫操作

  1. var connection = Configuration["DbConfig:Mysql:ConnectionString"]; 
  2.             var migrationsAssembly = IntrospectionExtensions.GetTypeInfo(typeof(Startup)).Assembly.GetName().Name
  3.             services.AddDbContext<OpenDbContext>(option => option.UseMySql(connection, ServerVersion.AutoDetect(connection), x => 
  4.             { 
  5.                 x.UseNewtonsoftJson(); 
  6.                 x.MigrationsAssembly(migrationsAssembly); 
  7.             })); 

生成遷移文件

引用組件

  1. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.5"
  2. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.5"

遷移命令

  1. add-migration Init 

結果

image.png

要看下生成的遷移文件是否是自己預期的那樣子,也可以在這一步就生成數據庫,命令:Update-Database

數據種子

增加OpenDbSend類,添加數據種子

  1. public class OpenDbSend 
  2.  { 
  3.      /// <summary> 
  4.      /// 生成數據庫以及數據種子 
  5.      /// </summary> 
  6.      /// <param name="dbContext">數據庫上下文</param> 
  7.      /// <param name="loggerFactory">日志</param> 
  8.      /// <param name="retry">重試次數</param> 
  9.      /// <returns></returns
  10.      public static async Task SeedAsync(OpenDbContext dbContext, 
  11.          ILoggerFactory loggerFactory, 
  12.          int? retry = 0) 
  13.      { 
  14.          int retryForAvailability = retry.Value; 
  15.          try 
  16.          { 
  17.              dbContext.Database.Migrate();//如果當前數據庫不存在按照當前 model 創建,如果存在則將數據庫調整到和當前 model 匹配 
  18.              await InitializeAsync(dbContext).ConfigureAwait(false); 
  19.  
  20.              //if (dbContext.Database.EnsureCreated())//如果當前數據庫不存在按照當前 model創建,如果存在則不管了。 
  21.              //  await InitializeAsync(dbContext).ConfigureAwait(false); 
  22.          } 
  23.          catch (Exception ex) 
  24.          { 
  25.              if (retryForAvailability < 3) 
  26.              { 
  27.                  retryForAvailability++; 
  28.                  var log = loggerFactory.CreateLogger<OpenDbSend>(); 
  29.                  log.LogError(ex.Message); 
  30.                  await SeedAsync(dbContext, loggerFactory, retryForAvailability).ConfigureAwait(false); 
  31.              } 
  32.          } 
  33.      } 
  34.  
  35.      /// <summary> 
  36.      /// 初始化數據 
  37.      /// </summary> 
  38.      /// <param name="context"></param> 
  39.      /// <returns></returns
  40.      public static async Task InitializeAsync(OpenDbContext context) 
  41.      { 
  42.          if (!context.Set<User>().Any()) 
  43.          { 
  44.              await context.Set<User>().AddAsync(new User("azrng""123456""azrng")).ConfigureAwait(false); 
  45.              await context.Set<User>().AddAsync(new User("張三""123456""azrng")).ConfigureAwait(false); 
  46.          } 
  47.          await context.SaveChangesAsync().ConfigureAwait(false); 
  48.      } 
  49.  } 

設置項目啟動時候調用

  1. public static async Task Main(string[] args) 
  2.        { 
  3.            var host = CreateHostBuilder(args).Build(); 
  4.            using (var scope = host.Services.CreateScope()) 
  5.            { 
  6.                var services = scope.ServiceProvider; 
  7.                var loggerFactory = services.GetRequiredService<ILoggerFactory>(); 
  8.                var _logger = loggerFactory.CreateLogger<Program>(); 
  9.                try 
  10.                { 
  11.                    var openContext = services.GetRequiredService<OpenDbContext>(); 
  12.                    await OpenDbSend.SeedAsync(openContext, loggerFactory).ConfigureAwait(false); 
  13.                } 
  14.                catch (Exception ex) 
  15.                { 
  16.                    _logger.LogError(ex, $"項目啟動出錯  {ex.Message}"); 
  17.                } 
  18.            } 
  19.  
  20.            await host.RunAsync().ConfigureAwait(false); 
  21.        } 

生成數據庫

啟動項目,自動生成數據庫

image.png

表結構如下

image.png

如果后期數據庫字段或者結構有變動,可以再次生成遷移文件然后生成數據庫

查詢數據

  1. /// <summary> 
  2. /// 用戶接口 
  3. /// </summary> 
  4. public interface IUserService 
  5.     string GetName(); 
  6.  
  7.     /// <summary> 
  8.     /// 查詢用戶信息 
  9.     /// </summary> 
  10.     /// <param name="account"></param> 
  11.     /// <returns></returns
  12.     Task<User> GetDetailsAsync(string account); 
  13.  
  14. /// <summary> 
  15. /// 用戶實現 
  16. /// </summary> 
  17. public class UserService : IUserService 
  18.     private readonly OpenDbContext _dbContext; 
  19.  
  20.     public UserService(OpenDbContext dbContext) 
  21.     { 
  22.         _dbContext = dbContext; 
  23.     } 
  24.  
  25.     public string GetName() 
  26.     { 
  27.         return "AZRNG"
  28.     } 
  29.  
  30.     ///<inheritdoc cref="IUserService.GetDetailsAsync(string)"/> 
  31.     public async Task<User> GetDetailsAsync(string account) 
  32.     { 
  33.         return await _dbContext.Set<User>().FirstOrDefaultAsync(t => t.Account == account).ConfigureAwait(false); 
  34.     } 

一般更推薦建立指定的返回Model類,然后只查詢需要的內容,不直接返回實體類

控制器方法

  1. /// <summary> 
  2. /// 查詢用戶詳情 
  3. /// </summary> 
  4. /// <param name="account"></param> 
  5. /// <returns></returns
  6. [HttpGet] 
  7. public async Task<ActionResult<User>> GetDetailsAsync(string account) 
  8.     return await _userService.GetDetailsAsync(account).ConfigureAwait(false); 

查詢結果

  1.   "id""e8976d0a-6ee9-4e2e-b8d8-1fe6e85b727b"
  2.   "account""azrng"
  3.   "password""123456"
  4.   "money": 0, 
  5.   "deleted"false
  6.   "creater""azrng"
  7.   "createTime""2021-05-09T15:48:45.730302"
  8.   "modifyer""azrng"
  9.   "modifyTime""2021-05-09T15:48:45.730425" 

參考文檔

實體類型:https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-types?tabs=data-annotations

實體屬性:https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-properties?tabs=data-annotations%2Cwithout-nrt

 

責任編輯:武曉燕 來源: 鵬祥
相關推薦

2010-05-07 14:29:45

Unix--Tripw

2016-08-23 13:35:22

MVCEFNuGet

2020-08-06 11:45:37

數據庫文檔Swagger

2009-12-30 14:12:53

ADO.NET Fra

2009-09-07 22:54:03

Linq組合查詢

2024-08-13 10:36:25

SpringScrew數據庫

2011-04-15 13:28:44

數據庫設計

2025-01-03 08:13:08

2017-08-23 13:50:32

2009-11-04 16:00:20

2010-05-13 14:27:52

訪問MySQL

2020-12-24 10:20:43

文檔工具語言

2011-03-04 09:40:42

AJAX開發集成數據庫

2009-05-14 14:23:25

微軟ado.netLINQ

2009-10-29 17:33:51

VB.NET線程方法

2010-05-20 14:52:42

MySQL數據庫

2010-09-30 09:11:01

2021-09-06 10:24:12

鴻蒙HarmonyOS應用

2010-09-30 08:27:48

2011-05-26 15:20:46

Oracle數據庫導出
點贊
收藏

51CTO技術棧公眾號

合欧美一区二区三区| 欧美日韩视频免费看| 91在线小视频| 国产精品国产三级国产aⅴ浪潮 | 亚洲乱码中文字幕| 精品人伦一区二区三区| 夜夜骚av一区二区三区| 欧美激情综合| 国产一区二区av| 91精产国品一二三| 成人视屏在线观看| 亚洲一区二区三区免费视频| 天天好比中文综合网| 亚洲毛片在线播放| 麻豆久久一区二区| 91高潮精品免费porn| 美女三级黄色片| 日韩理论电影中文字幕| 欧美一区二区三区四区久久| 国产成人亚洲精品无码h在线| 成人影院在线看| 久久久久久久久久看片| 97视频热人人精品| 最新中文字幕免费| 久久av最新网址| 国内免费精品永久在线视频| 色婷婷粉嫩av| 国产欧美日韩在线观看视频| 亚洲福利在线观看| 人妻体体内射精一区二区| a成人v在线| 婷婷综合另类小说色区| 中文字幕日韩一区二区三区不卡| 国产系列电影在线播放网址| 不卡视频在线观看| 91青青草免费观看| 国产又爽又黄又嫩又猛又粗| 日本色综合中文字幕| 欧日韩在线观看| 日韩免费不卡视频| 狠狠噜噜久久| 久久国产精品久久久| 后入内射无码人妻一区| 国产中文字幕一区二区三区| 亚洲欧美日韩一区在线| www.男人天堂| 久久久精品国产**网站| 精品久久人人做人人爰| 久久久久国产免费| 日韩有吗在线观看| 日韩欧美区一区二| 性生活一级大片| 国产美女视频一区二区| 91精品国产综合久久久久久久久久| 国模无码视频一区二区三区| 麻豆蜜桃在线观看| 欧美日韩亚洲91| 欧美 国产 日本| 电影一区二区三区| 91精品福利在线| 国产又猛又黄的视频| 成人在线免费av| 91精品国产一区二区三区| 国产美女视频免费看| 国产一区二区久久久久| 欧美一级高清片在线观看| 欧美一区二区三区影院| 97久久综合区小说区图片区| 精品成a人在线观看| 国产不卡一二三| 曰本一区二区三区视频| 中文字幕不卡在线视频极品| 欧美性x x x| 午夜精品电影| 7777精品视频| 中文字幕免费观看视频| 精品一区二区三区香蕉蜜桃| 99热在线播放| 可以免费看毛片的网站| 久久久一区二区三区| 一区二区三区久久网| 国产精品剧情| 午夜精品福利在线| 97公开免费视频| 久久国际精品| 日韩国产精品一区| 中国美女黄色一级片| 午夜国产一区| 国产精品成人播放| 国产喷水福利在线视频| 99国产精品一区| 亚洲va韩国va欧美va精四季| 人妖欧美1区| 色av成人天堂桃色av| 日韩在线一区视频| 日韩av影院| xxx一区二区| 久久久久久久久久影院| 美日韩一区二区三区| 国产精品乱子乱xxxx| av影片在线看| 图片区小说区区亚洲影院| 天天干天天爽天天射| 盗摄系列偷拍视频精品tp| 尤物yw午夜国产精品视频| 久久久久久久久久综合| 日本特黄久久久高潮| 精品国产乱码久久久久久郑州公司| 成人午夜影视| 天天操天天色综合| 亚洲综合123| 精品国产中文字幕第一页| 欧美黄色小视频| 中文字幕二区三区| 99天天综合性| 成人在线免费高清视频| 国产成人精选| 亚洲精品自在久久| 麻豆疯狂做受xxxx高潮视频| 日韩高清在线观看| 国产伦精品一区二区三区在线 | 日韩欧美天堂| 九九久久综合网站| 一级特黄录像免费看| 久久综合国产精品| 成人免费aaa| 亚洲小说春色综合另类电影| 俺去亚洲欧洲欧美日韩| 波多野结衣大片| 久久人人97超碰com| 成人免费性视频| 久久久久毛片免费观看| 久久精品国产69国产精品亚洲| 成年人视频免费| 91麻豆国产香蕉久久精品| 999在线观看视频| aaa国产精品| 欧美另类极品videosbestfree| 一级片视频免费| 中文字幕亚洲欧美在线不卡| 亚洲综合婷婷久久| 久久国产影院| 成人免费看黄网站| 欧美18一19xxx性| 欧美日韩1区2区| 萌白酱视频在线| 九一久久久久久| 欧美日韩视频免费在线观看| 99久久久成人国产精品| 久久色在线播放| av在线免费在线观看| 国产精品久久久久久久岛一牛影视| xxxx一级片| 日韩在线视屏| 91欧美精品成人综合在线观看| 成人免费高清| 欧美刺激午夜性久久久久久久| 538精品在线观看| 成人中文字幕电影| 毛片在线视频播放| 嫩草影视亚洲| 国产日韩欧美电影在线观看| 黄色成人影院| 精品成人一区二区三区四区| 五月天婷婷久久| 久久久不卡影院| 亚洲欧洲日本精品| 在线精品国产| 国产一区二区视频在线免费观看 | 中文字幕永久免费| 亚洲第一伊人| 午夜老司机精品| 国产中文欧美日韩在线| 欧美极品少妇xxxxⅹ裸体艺术| 午夜小视频在线播放| 欧美在线小视频| 国产一二三四区| www.欧美色图| wwww.国产| 国自产拍偷拍福利精品免费一| 精品国产一二| 亚洲精品555| 久久久久久国产精品三级玉女聊斋| 无码精品视频一区二区三区| 欧美日韩激情一区二区三区| 精品无码人妻一区二区三| 91免费看视频| 久久精品亚洲天堂| 日韩午夜在线| 一区二区不卡在线| 久久中文字幕导航| 国产欧美一区二区三区视频| 福利在线导航136| 一区二区三区国产视频| 亚洲av综合色区无码一二三区| 色悠久久久久综合欧美99| 三级在线观看免费大全| 久久人人97超碰com| 1314成人网| 日韩vs国产vs欧美| 日韩精品一区二区免费| 欧美性感美女一区二区| 国产伦精品一区二区三区高清版 | 欧美三级电影网站| 日本少妇裸体做爰| 国产精品二区一区二区aⅴ污介绍| 老司机午夜免费福利| 蜜桃在线一区二区三区| 免费成人午夜视频| 欧美99在线视频观看| 视频一区二区在线| 欧美色图五月天| 3d精品h动漫啪啪一区二区| av在线日韩| 午夜精品一区二区三区视频免费看| 秋霞成人影院| 亚洲色图五月天| 亚洲欧美自偷自拍| 欧美mv日韩mv国产网站| 国产精品高潮呻吟AV无码| 黄色一区二区在线| 麻豆影视在线播放| 中文字幕一区二区三区视频| x88av在线| 337p粉嫩大胆噜噜噜噜噜91av| 国产人妖在线观看| 精品一区二区精品| 奇米影音第四色| 久久一区中文字幕| 精品日韩在线观看| wwwxxx亚洲| 亚洲一本大道在线| 私库av在线播放| 亚洲婷婷综合色高清在线| 免费看91的网站| 久久精品人人爽人人爽| 人妻丰满熟妇av无码久久洗澡| 岛国精品一区二区| 波多野结衣三级视频| 国产乱理伦片在线观看夜一区| av免费一区二区| 精品一二线国产| 日韩欧美亚洲另类| 国产综合色产在线精品| 亚洲高清在线不卡| 国产伦精品一区二区三区视频青涩 | 精品福利电影| 波多野结衣av一区二区全免费观看| 中文字幕一区二区三三| 肉大捧一出免费观看网站在线播放| 91久久电影| 成人手机在线播放| 欧美freesex交免费视频| 国产在线拍揄自揄拍无码| 图片小说视频色综合| 午夜久久久久久久久久久| 欧美特黄视频| 波多野结衣综合网| 国产日韩欧美三区| 成人免费无码av| 免费看欧美美女黄的网站| 午夜两性免费视频| 国产一区二区三区在线观看免费视频| 亚洲自拍第三页| 国产成人免费在线视频| xxxwww国产| 久久色中文字幕| 多男操一女视频| 一区二区免费在线| 久久狠狠高潮亚洲精品| 色噜噜狠狠成人中文综合 | 日韩一区二区在线观看| 囯产精品一品二区三区| 精品亚洲夜色av98在线观看| 国产高清一区在线观看| 久久精品国产精品亚洲| 男女羞羞视频在线观看| 欧美在线免费观看| 色综合视频一区二区三区日韩| 99伊人久久| 国产最新精品| 香港三级日本三级a视频| 麻豆精品网站| 日本精品一区在线| 99久久伊人网影院| 中国特黄一级片| 亚洲午夜精品在线| 自拍偷拍18p| 日韩欧美在线不卡| 久久久久久女乱国产| 久久午夜a级毛片| 人狥杂交一区欧美二区| 成人午夜小视频| 亚洲婷婷影院| 国产精品三级一区二区| 日韩高清不卡在线| 成人做爰69片免费| 国产精品无人区| 日韩欧美大片在线观看| 91精品国产免费久久综合| 欧美视频综合| 欧美精品18videos性欧| 欧美大片1688网站| 国产一区二区久久久| 亚洲国产精品日韩专区av有中文| www.com毛片| 国产成人亚洲精品狼色在线 | 亚洲乱码国产乱码精品精可以看| 中文字幕精品三级久久久| 91精品国产黑色紧身裤美女| 噜噜噜在线观看播放视频| 欧美激情日韩图片| 国产原创一区| 欧美日韩亚洲在线| 99精品99| 欧美性生交xxxxx| 成人免费一区二区三区视频| 国产精品久久久久久人| 亚洲精品一线二线三线| 爆操欧美美女| 成人黄色网免费| 精品日韩毛片| 蜜臀av午夜一区二区三区| 99久久久免费精品国产一区二区| 亚洲综合网在线| 6080国产精品一区二区| 3p视频在线观看| 国产精品电影在线观看| 一呦二呦三呦国产精品| 日韩欧美一区二| 成人动漫一区二区| 久久综合综合久久| 日韩午夜av电影| 岛国中文字幕在线| 91色p视频在线| 综合日韩在线| 男生和女生一起差差差视频| 最新热久久免费视频| 一区二区国产欧美| 中文字幕亚洲精品| 国产69精品久久久久9999人| 日韩免费毛片| 日韩成人免费看| 18精品爽国产三级网站| 欧美日韩中文字幕一区| 成在在线免费视频| 国产精品一区二区三区久久久 | 香港久久久电影| 成人在线免费高清视频| 成人免费视频网站在线观看| 久久精品欧美一区二区| 亚洲二区中文字幕| 性xxxxfreexxxxx欧美丶| 日韩av影视| 麻豆国产精品一区二区三区 | 国产精品免费观看| 国产精品视频网| 国产精品99久久| 日本女人性视频| 偷拍一区二区三区四区| 免费毛片在线| 国产欧美精品日韩| 中文字幕日韩欧美精品高清在线| 精品人妻人人做人人爽夜夜爽| 亚洲国产精品一区二区尤物区| 天堂中文在线8| 国产精品99一区| 在线国产一区二区| 91精品啪在线观看国产| 色婷婷综合久久久中文字幕| av电影在线播放高清免费观看| 91亚洲一区精品| 亚洲国产欧美国产综合一区| 成都免费高清电影| 欧美日韩美少妇 | 国产91色在线|免| 欧美国产偷国产精品三区| 4438x全国最大成人| 欧美日韩性视频在线| 日本视频在线播放| 狠狠久久综合婷婷不卡| 免费精品99久久国产综合精品| 放荡的美妇在线播放| 亚洲精品国产欧美| 狠狠久久综合| 欧美精品久久久久久久自慰| 国产蜜臀97一区二区三区| 亚洲AV午夜精品| 国产精品久久久久久久久久ktv| 午夜久久福利| brazzers精品成人一区| 欧美一区二区观看视频| 中文字幕在线高清| 午夜啪啪福利视频| 久久天天做天天爱综合色| 99在线观看精品视频| 国产精品va在线播放| 在线不卡欧美| 欧美一级片在线视频| 亚洲人精品午夜在线观看|