[英]How to seed values in a SQL database using IdentityUser as a foreign key?
我使用一个名为Seeds的静态类,它使用Program.cs中的数据样本为我的数据库设定种子:
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
// Get services
var services = scope.ServiceProvider;
// Create/Seed the database
Seeds.SeedDatabase(services);
// Create the roles for the application
var serviceProvider = services.GetRequiredService<IServiceProvider>();
var configuration = services.GetRequiredService<IConfiguration>();
Seeds.CreateRoles(serviceProvider, configuration).Wait();
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>();
}
这是种子:
public class Seeds
{
public static void SeedDatabase(IServiceProvider serviceProvider)
{
// Seed DB
using (var _db = new AppDbContext(serviceProvider.GetRequiredService<DbContextOptions<AppDbContext>>()))
{
Console.WriteLine("\n Looking for a database... \n");
// Look for a database
if (!_db.Database.EnsureCreated())
{
// Debug message
string message = "\n There is already a database. \n";
Console.WriteLine(message);
// DB has been seeded before
}
else
{
// Debug message
string message = "\n A new database has been created. \n";
Console.WriteLine(message);
_db.FlightSettings.Add(
new FlightSetting(
...Variables...
),
);
...Here other values are seeded as FlightSettings...
// Save the data samples
_db.SaveChanges();
// DB has been seeded now
}
}
}
}
public static async Task CreateRoles(IServiceProvider serviceProvider)
{
//adding customs roles
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var UserManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();
// Roles in the project
string[] roleNames = { "Pilot", "Office" };
IdentityResult roleResult;
foreach (var roleName in roleNames)
{
// creating the roles and seeding them to the database
var roleExist = await RoleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
}
}
// create custom users
var officeUser = new AppUser
{
UserName = "paulita",
Email = "paulita@",
Password = "paulita"
};
var pilots = new AppUser[] {
new AppUser
{
Name = "pablito",
IdentityDocument = 80421514,
EmployeeNumber = 52641958,
UserName = "pcastellanos",
Email = "pablito@",
Password = "pablito",
BornDate = new DateTime(1990, 6, 20)
},
new AppUser
{
Name = "pedrito",
IdentityDocument = 1098808192,
EmployeeNumber = 62549214,
UserName = "privero",
Email = "pedrito@",
Password = "pedrito",
BornDate = new DateTime(1992, 8, 10)
}
};
foreach (var pilot in pilots)
{
await UserManager.CreateAsync(pilot, pilot.Password);
await UserManager.AddToRoleAsync(pilot, "Pilot");
}
await UserManager.CreateAsync(officeUser, officeUser.Password);
await UserManager.AddToRoleAsync(officeUser, "Office");
using (var _db = new AppDbContext(serviceProvider.GetRequiredService<DbContextOptions<AppDbContext>>()))
{
var myPilots = await UserManager.GetUsersInRoleAsync("Pilot");
AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");
var flightSettings = await _db.FlightSettings.ToListAsync();
await _db.PilotTests.AddAsync(
new PilotTest
{
Pilot = myUser,
SimulationSetting = flightSettings[0]
}
);
// Save the data samples
_db.SaveChanges();
正如您在此行中所看到的:
var myPilots = await UserManager.GetUsersInRoleAsync("Pilot");
我向数据库请求角色为“Pilot”的所有用户。 我在创建PilotTest时遇到错误,因为在PilotTest中而不仅仅是引用相应的AppUser,它还会尝试再次创建AppUser,并且由于用户已经存在,VisualStudio会告诉我数据库中已经有一个条目Primay Key。
每个PiloTest都应该引用一个Pilot。 这是DB中的PilotTest表:
我试着在这里添加一个Pilot:
AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");
但同样的事情发生了。
以下是classess:
public class PilotTest
{
// Unique ID
[Key]
public string Id { get; set; }
// The pilot responsible for this test
public AppUser Pilot { get; set; }
// FlightSetting of the simulation
public FlightSetting SimulationSetting { get; set; }
...Other variables...
}
public class AppUser : IdentityUser
{
// Custom variables on users
public string Name { get; set; }
public int IdentityDocument { get; set; }
public int EmployeeNumber { get; set; }
public DateTime BornDate { get; set; }
// For debugging purposes
public string Password { get; set; }
}
我的理论是我做错了什么,但几天前我找不到任何解决办法。
对于您当前的defination密码paulita
,根据默认密码规则,它是无效的。 你可以改变下面的代码,检查result
你会发现错误。
foreach (var pilot in pilots)
{
var result = await UserManager.CreateAsync(pilot, pilot.Password);
await UserManager.AddToRoleAsync(pilot, "Pilot");
}
如果您更喜欢此密码,则需要配置IdentityOptions
services.AddDefaultIdentity<AppUser>(options => {
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequireDigit = false;
})
这是我现在的Seeds
public class Seeds
{
public static void SeedDatabase(IServiceProvider serviceProvider)
{
// Seed DB
using (var _db = serviceProvider.GetRequiredService<TestMVC2_1Context>())
{
Console.WriteLine("\n Looking for a database... \n");
// Look for a database
if (!_db.Database.EnsureCreated())
{
// Debug message
string message = "\n There is already a database. \n";
Console.WriteLine(message);
// DB has been seeded before
}
else
{
// Debug message
string message = "\n A new database has been created. \n";
Console.WriteLine(message);
// Save the data samples
_db.SaveChanges();
// DB has been seeded now
}
}
}
public static async Task CreateRoles(IServiceProvider serviceProvider)
{
//adding customs roles
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var UserManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();
// Roles in the project
string[] roleNames = { "Pilot", "Office" };
IdentityResult roleResult;
foreach (var roleName in roleNames)
{
// creating the roles and seeding them to the database
var roleExist = await RoleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
}
}
// create custom users
var officeUser = new AppUser
{
UserName = "paulita",
Email = "paulita@",
Password = "paulita"
};
var pilots = new AppUser[] {
new AppUser
{
Name = "pablito",
IdentityDocument = 80421514,
EmployeeNumber = 52641958,
UserName = "pcastellanos",
Email = "pablito@",
Password = "pablito",
BornDate = new DateTime(1990, 6, 20)
},
new AppUser
{
Name = "pedrito",
IdentityDocument = 1098808192,
EmployeeNumber = 62549214,
UserName = "privero",
Email = "pedrito@",
Password = "pedrito",
BornDate = new DateTime(1992, 8, 10)
}
};
foreach (var pilot in pilots)
{
var result = await UserManager.CreateAsync(pilot, pilot.Password);
await UserManager.AddToRoleAsync(pilot, "Pilot");
}
await UserManager.CreateAsync(officeUser, officeUser.Password);
await UserManager.AddToRoleAsync(officeUser, "Office");
using (var _db = serviceProvider.GetRequiredService<TestMVC2_1Context>())
{
var myPilots = await UserManager.GetUsersInRoleAsync("Pilot");
AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");
await _db.PilotTests.AddAsync(
new PilotTest
{
Pilot = myUser,
}
);
// Save the data samples
_db.SaveChanges();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.