asp.net - 如何通过 asp.net 项目中的 Seed 传递 FK 的值
问题描述
我使用种子将默认数据输入数据库,但我遇到了一个问题,即FK,如何将FK的值传递给两个表而没有任何问题?
运行程序时出现此错误: SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_AspNetUsers_Departments_DepartmentId”冲突。数据库“HRS.WEB1”、表“dbo.Departments”、“Id”列中发生冲突。该语句已终止。
public static class DbSeeder
{
public static IHost SeedDb(this IHost webHost)
{
using var scope = webHost.Services.CreateScope();
try
{
var context = scope.ServiceProvider.GetRequiredService<HRSDbContext>();
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<Employee>>();
context.SeedDepartment().Wait();
userManager.SeedEmployee().Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
return webHost;
}
public static async Task SeedDepartment(this HRSDbContext _db)
{
if (await _db.Departments.AnyAsync())
{
return;
}
var departments = new List<Department>();
var department = new Department();
department.Name = "A1";
department.Id = 1;
department.CreatedAt = DateTime.Now;
var department2 = new Department();
department2.Name = "A2";
department2.Id = 2;
department2.CreatedAt = DateTime.Now;
departments.Add(department);
departments.Add(department2);
await _db.Departments.AddRangeAsync(departments);
await _db.SaveChangesAsync();
}
public static async Task SeedEmployee(this UserManager<Employee> userManger)
{
if (await userManger.Users.AnyAsync())
{
return;
}
var user = new Employee();
user.FullName = "System Developer";
user.UserName = "dev@gmail.com";
user.Email = "dev@gmail.com";
user.CreatedAt = DateTime.Now;
await userManger.CreateAsync(user, "Admin111$$");
}
}
解决方案
有多种方法可以做到这一点,我不知道您模型的确切结构,但无论如何日志应该是相同的:
首先 - 硬值:
public static async Task SeedEmployee(this UserManager<Employee> userManger)
{
if (await userManger.Users.AnyAsync())
{
return;
}
var user = new Employee();
user.FullName = "System Developer";
user.UserName = "dev@gmail.com";
user.Email = "dev@gmail.com";
user.CreatedAt = DateTime.Now;
user.DepartmentId = 1; //here
await userManger.CreateAsync(user, "Admin111$$");
}
第二 - 返回您添加的部门,然后将其作为参数传递:
public static IHost SeedDb(this IHost webHost)
{
using var scope = webHost.Services.CreateScope();
try
{
var context = scope.ServiceProvider.GetRequiredService<HRSDbContext>();
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<Employee>>();
var departments = context.SeedDepartment().Wait();
userManager.SeedEmployee(departments.First().Id ).Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
return webHost;
}
public static async Task<IEnumerable<Department>> SeedDepartment(this HRSDbContext _db)
{
var _departments = await _db.Departments.AllAsync()
if (_departments != null)
{
return _departments;
}
var departments = new List<Department>();
var department = new Department();
department.Name = "A1";
department.Id = 1;
department.CreatedAt = DateTime.Now;
var department2 = new Department();
department2.Name = "A2";
department2.Id = 2;
department2.CreatedAt = DateTime.Now;
departments.Add(department);
departments.Add(department2);
await _db.Departments.AddRangeAsync(departments);
await _db.SaveChangesAsync();
return departments;
}
public static async Task SeedEmployee(this UserManager<Employee> userManger, int departmentId)
{
if (await userManger.Users.AnyAsync())
{
return;
}
var user = new Employee();
user.FullName = "System Developer";
user.UserName = "dev@gmail.com";
user.Email = "dev@gmail.com";
user.CreatedAt = DateTime.Now;
user.DepartmentId = departmentId;
await userManger.CreateAsync(user, "Admin111$$");
}
推荐阅读
- installation - 为什么 DNN9 安装向导返回错误
- typescript - GraphQL:是否有相当于 TypeScript 的“未知”?
- json - 将 Azure 数据工厂中的 JSON 表数组数据从 Log Analytics REST API JSON 响应转换为同一文件中的多个 JSON 文档
- android-studio - 如何在 Android Studio 中将 Kotlin 类属性打印到 Logcat?
- spring - 如果突然结束,如何从特定点重新启动弹簧批次
- typescript - 如何在打字稿中组合类型?
- r - R中有没有办法找到每种因素组合之间的重叠百分比?
- winapi - 检查 Windows 应用程序是否作为服务运行
- javascript - Bootstrap javascript 不适用于本地托管的 Bootstrap 4
- firebase - 在身份验证类中设置状态?