播种数据MVC 6 .NET Core应用程序

目录

目标

介绍

使用的组件

创建项目

DbInitializer类

结论


目标

就像MVC 5一样,我试图启用自动迁移和播种默认数据,但似乎在MVC 6中已更改了行为,所以我想我会分享一些技巧。

介绍

在这里,我们将尝试在MVC 6 ASP.NET Core 2.2应用程序中学习播种数据。在这里,主要是播种数据只是我们系列的一部分。

使用Visual Studio 2019,我使用默认模板创建了.NET Core 2.2 Web应用程序。现在,我的要求是在使用实体框架迁移创建数据库时播种一些默认数据。

为此,我们将在项目中创建一个类DbInitializer.cs并从Startup.cs类中调用其Initialize函数。

使用的组件

创建项目

Visual Studio 2019中创建Web应用程序:

选择语言C项目类型网页,然后选择第一个模板,ASP.NET核心Web应用程序,然后单击下一步

这是我的appsettings.json的样子:

我将使用本地主机作为Windows身份验证的服务器。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=Mvc.SeedingData;
                          Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

提供项目名称并选择物理路径,然后单击创建。它将创建项目,然后在新项目中添加一个新的实体Terminal

public class Terminal
{
    public int Id { get; set; }

    public string Name { get; set; }

    public DateTime CreatedDate { get; set; }
}

这是我DbContext类的样子:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
    {

    }

    public DbSet<Terminal> Terminal { get; set; }
}

现在,我们需要从Migrations文件夹中删除所有内容,因为我们在运行迁移和播种数据的DbContext类中添加了一个应在数据库中创建的新实体。

现在,我们需要运行Add-migration命令并为迁移命名。

注意Enable-migrations命令已过时。

现在,我们可以运行Update-database命令以使用我们的代码优先模型来创建数据库。现在我们的数据库将就位,但是到目前为止,表中没有任何数据。

DbInitializer

现在,我在项目中添加了一个新类DbInitializer.cs,我们可以通过该ApplicationDbContext类调用默认值在数据库中的播种。

我添加了默认的管理员角色和一个用户,因此当我们启动该应用程序时,我们可以登录。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Mvc.SeedingData.Data;
using System;
using System.Linq;

namespace Mvc.SeedingData
{
    public static class DbInitializer
    {
        public static void Initialize(IApplicationBuilder app)
        {
            using (var serviceScope = app.ApplicationServices.CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
                context.Database.EnsureCreated();

                var _userManager = 
                         serviceScope.ServiceProvider.GetService<UserManager<IdentityUser>>();
                var _roleManager = 
                         serviceScope.ServiceProvider.GetService<RoleManager<IdentityRole>>();

                if (!context.Users.Any(usr => usr.UserName == "[email protected]"))
                {
                    var user = new IdentityUser()
                    {
                        UserName = "[email protected]",
                        Email = "[email protected]",
                        EmailConfirmed = true,
                    };

                    var userResult = _userManager.CreateAsync(user, "P@ssw0rd").Result;
                }

                if (!_roleManager.RoleExistsAsync("Admin").Result)
                {
                    var role = _roleManager.CreateAsync
                               (new IdentityRole { Name = "Admin" }).Result;
                }

                var adminUser = _userManager.FindByNameAsync("[email protected]").Result;
                var userRole = _userManager.AddToRolesAsync
                               (adminUser, new string[] { "Admin" }).Result;


                var terminal = context.Terminal
                                  .Where(x => x.Name == "Test").FirstOrDefault();

                if (terminal == null)
                {
                    terminal = new Terminal()
                    {
                        Name = "Test",
                        CreatedDate = DateTime.Now,
                    };

                    context.Terminal.Add(terminal);
                }

                context.SaveChanges();
            }
        }
    }
}

我只想在Startup.cs类的开发模式下运行DbInitializer。我们还需要在服务中添加IdentityUserIdentityRole

public void ConfigureServices(IServiceCollection services)
{
    ..........

    services.AddDefaultIdentity<IdentityUser>(options =>
    {
         options.Password.RequireDigit = true;
         options.Password.RequiredLength = 6;
         options.Password.RequireNonAlphanumeric = false;
         options.Password.RequireUppercase = false;
         options.Password.RequireLowercase = false;
    })
      .AddRoles<IdentityRole>()
      .AddDefaultUI(UIFramework.Bootstrap4)
      .AddEntityFrameworkStores<ApplicationDbContext>();

     services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
         app.UseDatabaseErrorPage();

         DbInitializer.Initialize(app);
     }

     ..........................
}

现在,当我们在开发模式下启动项目时,它将调用DbInitializer classInitialize方法并将数据插入数据库表中。

结论

通过迁移创建数据库并在开发环境下启动项目时,我们已经实现了将默认数据播种到数据库中的目标。

发布了69 篇原创文章 · 获赞 146 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/mzl87/article/details/104932386