在MVC 6 .NET核心应用程序中添加种子数据

70 篇文章 3 订阅

目录

目标

介绍

使用的组件

创建项目

DbInitializer类

结论


目标

就像MVC 5一样,我试图启用自动迁移和Seeding默认数据,但似乎MVC 6中的行为已经改变,所以我想分享这个提示。

介绍

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

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

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

使用的组件

创建项目

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

 

选择语言C项目类型Web,然后选择第一个模板,ASP.NET Core Web Application并单击Next

 

以下是我的appsettings.json内容:

我将使用localhost作为我的服务器进行Windows身份验证。

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

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

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 == "demo@test.com"))
                {
                    var user = new IdentityUser()
                    {
                        UserName = "demo@test.com",
                        Email = "demo@test.com",
                        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("demo@test.com").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方法并将数据插入数据库表。

结论

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

 

原文地址:https://www.codeproject.com/Articles/5163367/Seeding-Data-MVC-6-NET-Core-Application

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值