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

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2019-08-28 20:29:17 ,浏览量:1

目录

目标

介绍

使用的组件

创建项目

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

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

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 classInitialize方法并将数据插入数据库表。

结论

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

 

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

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

微信扫码登录

0.0452s