目录
目标
介绍
使用的组件
创建项目
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.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
方法并将数据插入数据库表。
当我们通过迁移创建数据库并在开发环境下启动项目时,我们已经实现了将默认数据存储到数据库中的目标。
原文地址:https://www.codeproject.com/Articles/5163367/Seeding-Data-MVC-6-NET-Core-Application