zoukankan      html  css  js  c++  java
  • 【ASP.NET Core快速入门】(十六)MVC开发:DbContextSeed初始化

    前言

    由于我们现在每次EF实体模型变化的时候每次都是手动更改,我们想通过代码的方式让他自动更新,或者程序启动的时候添加一些数据进去

    DbContextSeed初始化

    首先,在Data文件夹下添加一个ApplicationDbContextSeed.cs初始化类

    using Microsoft.AspNetCore.Identity;
    using MvcCookieAuthSample.Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace MvcCookieAuthSample.Data
    {
        public class ApplicationDbContextSeed
        {
            private UserManager<ApplicationUser> _userManager;
    
            public async Task SeedAsync(ApplicationDbContext context, IServiceProvider services)
            {
                if (!context.Users.Any())
                {
                    _userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
    
                    var defaultUser = new ApplicationUser
                    {
                         UserName="Administrator",
                         Email="786744873@qq.com",
                         NormalizedUserName="admin"
                    };
    
                    var result= await _userManager.CreateAsync(defaultUser,"Password$123");
                    if (!result.Succeeded)
                    {
                        throw new Exception("初始默认用户失败");
                    }
                }
            }
        }
    }

    那么如何调用呢?接下来我们写一个WebHost的扩展方法类WebHostMigrationExtensions.cs来调用ApplicationDbContextSeed方法

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    
    namespace MvcCookieAuthSample.Data
    {
        public static class WebHostMigrationExtensions
        {
            public static IWebHost MigrateDbContext<TContext>(this IWebHost host, Action<TContext, IServiceProvider> sedder) where TContext : DbContext
            {
                using (var scope=host.Services.CreateScope())
                {//只在本区间内有效
                    var services = scope.ServiceProvider;
                    var logger = services.GetRequiredService<ILogger<TContext>>();
                    var context = services.GetService<TContext>();
    
                    try
                    {
                        context.Database.Migrate();
                        sedder(context, services);
    
                        logger.LogInformation($"执行DBContext {typeof(TContext).Name} seed执行成功");
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, $"执行DBContext {typeof(TContext).Name} seed方法失败");
                    }
                }
    
                return host;
            }
        }
    }

    那么我们程序启动的时候要怎调用呢?

    要在Program.cs中执行

     我们接下来把数据库删掉,然后启动程序运行一下

    数据库已自动生成并插入数据

    源码点击下载

    Core2.2版本源码

  • 相关阅读:
    Hibernate 学习-3
    Hibernate反向工程使用心得
    MyEclipse中自动整合Spring3+Hibernate/JPA
    jsp页面不显示问题
    jstl获取当前系统时间的方法
    js实现12小时时钟
    从servlet跳到jsp页面,并用jstl 进行判断和显示方法
    jsp调用js文件时出现乱码
    常见异常总结
    js实现表单验证
  • 原文地址:https://www.cnblogs.com/wyt007/p/8253164.html
Copyright © 2011-2022 走看看