溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

用.NET生成數(shù)據(jù)庫的方法步驟

發(fā)布時間:2021-10-09 16:45:19 來源:億速云 閱讀:171 作者:iii 欄目:數(shù)據(jù)庫

本篇內(nèi)容介紹了“用.NET生成數(shù)據(jù)庫的方法步驟”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

用.NET生成數(shù)據(jù)庫的方法步驟

開篇語

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

本次示例環(huán)境:vs2019、net5、mysql

創(chuàng)建項目

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

可以通過可視化界面創(chuàng)建或者通過命令行創(chuàng)建

dotnet new webapi -o Net5ByDocker

創(chuàng)建實體類

安裝連接MySQL數(shù)據(jù)庫組件

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

增加實體類

[Table("user")]   public class User   {       public User()       {           Id = Guid.NewGuid().ToString();       }        public User(string account, string password, string creater) : this()       {           Account = account;           Password = password;           Deleted = false;           SetCreater(creater);       }        [Key]       [Comment("主鍵")]       [StringLength(36)]       [Required]       public string Id { get; private set; }        [Comment("帳號")]       [StringLength(36)]       [Required]       public string Account { get; private set; }        [Comment("密碼")]       [StringLength(36)]       [Required]       public string Password { get; private set; }        [Comment("余額")]       [Column(TypeName = "decimal(18, 2)")]       [Required]       public decimal Money { get; set; }        [Comment("是否刪除")]       [Column(TypeName = "tinyint(1)")]       [Required]       public bool Deleted { get; private set; }        [Comment("創(chuàng)建人")]       [StringLength(20)]       [Required]       public string Creater { get; private set; }        [Comment("創(chuàng)建時間")]       [Required]       public DateTime CreateTime { get; private set; }        [Comment("修改人")]       [StringLength(20)]       [Required]       public string Modifyer { get; private set; }        [Comment("修改時間")]       [Required]       public DateTime ModifyTime { get; private set; }        public void SetCreater(string name)       {           Creater = name;           CreateTime = DateTime.Now;           SetModifyer(name);       }        public void SetModifyer(string name)       {           Modifyer = name;           ModifyTime = DateTime.Now;       }   }

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

增加數(shù)據(jù)庫上下文OpenDbContext

public class OpenDbContext : DbContext     {         public OpenDbContext(DbContextOptions<OpenDbContext> options)             : base(options)         {         }          public DbSet<User> Users { get; set; }     }

Startup注入連接數(shù)據(jù)庫操作

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

生成遷移文件

引用組件

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

遷移命令

add-migration Init

結(jié)果

用.NET生成數(shù)據(jù)庫的方法步驟

image.png

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

數(shù)據(jù)種子

增加OpenDbSend類,添加數(shù)據(jù)種子

public class OpenDbSend  {      /// <summary>      /// 生成數(shù)據(jù)庫以及數(shù)據(jù)種子      /// </summary>      /// <param name="dbContext">數(shù)據(jù)庫上下文</param>      /// <param name="loggerFactory">日志</param>      /// <param name="retry">重試次數(shù)</param>      /// <returns></returns>      public static async Task SeedAsync(OpenDbContext dbContext,          ILoggerFactory loggerFactory,          int? retry = 0)      {          int retryForAvailability = retry.Value;          try          {              dbContext.Database.Migrate();//如果當(dāng)前數(shù)據(jù)庫不存在按照當(dāng)前 model 創(chuàng)建,如果存在則將數(shù)據(jù)庫調(diào)整到和當(dāng)前 model 匹配              await InitializeAsync(dbContext).ConfigureAwait(false);               //if (dbContext.Database.EnsureCreated())//如果當(dāng)前數(shù)據(jù)庫不存在按照當(dāng)前 model創(chuàng)建,如果存在則不管了。              //  await InitializeAsync(dbContext).ConfigureAwait(false);          }          catch (Exception ex)          {              if (retryForAvailability < 3)              {                  retryForAvailability++;                  var log = loggerFactory.CreateLogger<OpenDbSend>();                  log.LogError(ex.Message);                  await SeedAsync(dbContext, loggerFactory, retryForAvailability).ConfigureAwait(false);              }          }      }       /// <summary>      /// 初始化數(shù)據(jù)      /// </summary>      /// <param name="context"></param>      /// <returns></returns>      public static async Task InitializeAsync(OpenDbContext context)      {          if (!context.Set<User>().Any())          {              await context.Set<User>().AddAsync(new User("azrng", "123456", "azrng")).ConfigureAwait(false);              await context.Set<User>().AddAsync(new User("張三", "123456", "azrng")).ConfigureAwait(false);          }          await context.SaveChangesAsync().ConfigureAwait(false);      }  }

設(shè)置項目啟動時候調(diào)用

public static async Task Main(string[] args)        {            var host = CreateHostBuilder(args).Build();            using (var scope = host.Services.CreateScope())            {                var services = scope.ServiceProvider;                var loggerFactory = services.GetRequiredService<ILoggerFactory>();                var _logger = loggerFactory.CreateLogger<Program>();                try                {                    var openContext = services.GetRequiredService<OpenDbContext>();                    await OpenDbSend.SeedAsync(openContext, loggerFactory).ConfigureAwait(false);                }                catch (Exception ex)                {                    _logger.LogError(ex, $"項目啟動出錯  {ex.Message}");                }            }             await host.RunAsync().ConfigureAwait(false);        }

生成數(shù)據(jù)庫

啟動項目,自動生成數(shù)據(jù)庫

用.NET生成數(shù)據(jù)庫的方法步驟

image.png

表結(jié)構(gòu)如下

用.NET生成數(shù)據(jù)庫的方法步驟

image.png

如果后期數(shù)據(jù)庫字段或者結(jié)構(gòu)有變動,可以再次生成遷移文件然后生成數(shù)據(jù)庫

查詢數(shù)據(jù)

/// <summary> /// 用戶接口 /// </summary> public interface IUserService {     string GetName();      /// <summary>     /// 查詢用戶信息     /// </summary>     /// <param name="account"></param>     /// <returns></returns>     Task<User> GetDetailsAsync(string account); }  /// <summary> /// 用戶實現(xiàn) /// </summary> public class UserService : IUserService {     private readonly OpenDbContext _dbContext;      public UserService(OpenDbContext dbContext)     {         _dbContext = dbContext;     }      public string GetName()     {         return "AZRNG";     }      ///<inheritdoc cref="IUserService.GetDetailsAsync(string)"/>     public async Task<User> GetDetailsAsync(string account)     {         return await _dbContext.Set<User>().FirstOrDefaultAsync(t => t.Account == account).ConfigureAwait(false);     } }

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

控制器方法

/// <summary> /// 查詢用戶詳情 /// </summary> /// <param name="account"></param> /// <returns></returns> [HttpGet] public async Task<ActionResult<User>> GetDetailsAsync(string account) {     return await _userService.GetDetailsAsync(account).ConfigureAwait(false); }

查詢結(jié)果

{   "id": "e8976d0a-6ee9-4e2e-b8d8-1fe6e85b727b",   "account": "azrng",   "password": "123456",   "money": 0,   "deleted": false,   "creater": "azrng",   "createTime": "2021-05-09T15:48:45.730302",   "modifyer": "azrng",   "modifyTime": "2021-05-09T15:48:45.730425" }

“用.NET生成數(shù)據(jù)庫的方法步驟”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI