您当前的位置: 首页 >  .net

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2020-03-18 21:36:01 ,浏览量:0

目录

目标

介绍

使用的组件

创建项目

DbInitializer类

结论

  • 下载源代码-928 KB
目标

就像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社区版本
  • 我正在使用SQL Server Developer版本17.9.1,可以从此链接下载它。
创建项目

在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 options)
            : base(options)
    {

    }

    public DbSet 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();
                context.Database.EnsureCreated();

                var _userManager = 
                         serviceScope.ServiceProvider.GetService();
                var _roleManager = 
                         serviceScope.ServiceProvider.GetService();

                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。我们还需要在服务中添加IdentityUser和IdentityRole。

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

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

     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 class的Initialize方法并将数据插入数据库表中。

结论

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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0977s