最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET之生成數據庫全流程實現

 更新時間:2021年05月12日 09:48:44   作者:AZRNG  
這篇文章主要介紹了.NET之生成數據庫全流程實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

開篇語

本文主要是回顧下從項目創(chuàng)建到生成數據到數據庫(代碼優(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)建實體類

安裝組件

    <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實現,詳情看參考文檔

增加數據庫上下文OpenDbContext

    public class OpenDbContext : DbContext
    {
        public OpenDbContext(DbContextOptions<OpenDbContext> options)
            : base(options)
        {
        }

        public DbSet<User> Users { get; set; }
    }

Startup注入連接數據庫操作

            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

結果

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

數據種子

增加OpenDbSend類,添加數據種子

    public class OpenDbSend
    {
        /// <summary>
        /// 生成數據庫以及數據種子
        /// </summary>
        /// <param name="dbContext">數據庫上下文</param>
        /// <param name="loggerFactory">日志</param>
        /// <param name="retry">重試次數</param>
        /// <returns></returns>
        public static async Task SeedAsync(OpenDbContext dbContext,
            ILoggerFactory loggerFactory,
            int? retry = 0)
        {
            int retryForAvailability = retry.Value;
            try
            {
                dbContext.Database.Migrate();//如果當前數據庫不存在按照當前 model 創(chuàng)建,如果存在則將數據庫調整到和當前 model 匹配
                await InitializeAsync(dbContext).ConfigureAwait(false);

                //if (dbContext.Database.EnsureCreated())//如果當前數據庫不存在按照當前 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>
        /// 初始化數據
        /// </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);
        }
    }

設置項目啟動時候調用

        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);
        }

生成數據庫

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

表結構如下

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

查詢數據

    /// <summary>
    /// 用戶接口
    /// </summary>
    public interface IUserService
    {
        string GetName();

        /// <summary>
        /// 查詢用戶信息
        /// </summary>
        /// <param name="account"></param>
        /// <returns></returns>
        Task<User> GetDetailsAsync(string account);
    }

    /// <summary>
    /// 用戶實現
    /// </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類,然后只查詢需要的內容,不直接返回實體類

控制器方法

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

查詢結果

{
  "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"
}

參考文檔

實體類型: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

到此這篇關于.NET之生成數據庫全流程實現的文章就介紹到這了,更多相關.NET 生成數據庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

贵州省| 德江县| 成都市| 深泽县| 菏泽市| 盐源县| 龙门县| 苍山县| 安庆市| 调兵山市| 通州市| 肥东县| 伊金霍洛旗| 高陵县| 祁阳县| 固原市| 平远县| 阳谷县| 姜堰市| 运城市| 武宣县| 临海市| 堆龙德庆县| 达孜县| 通州市| 泽普县| 亚东县| 昆山市| 汉源县| 兴隆县| 荆州市| 育儿| 双柏县| 崇明县| 新田县| 滦南县| 津市市| 宝应县| 山阳县| 海淀区| 三门县|