目录
目标
介绍
使用的组件
创建项目
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.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方法并将数据插入数据库表中。
通过迁移创建数据库并在开发环境下启动项目时,我们已经实现了将默认数据播种到数据库中的目标。