Пояснение:
Я использую статический класс 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");
Запрашиваю в базу данных всех пользователей в роли «Пилот». Я получаю сообщение об ошибке при создании PilotTest, потому что в PilotTest вместо простой ссылки на соответствующий AppUser он также пытается снова создать AppUser, и, поскольку пользователь уже существует, VisualStudio сообщает мне, что в базе данных уже есть запись с тот ключ Примая.
Каждый PiloTest должен ссылаться на одного пилота. Вот таблица PilotTest в БД:
Я попытался добавить сюда только одного Пилота:
AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");
Но то же самое происходит.
Вот оба класса:
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; }
}
Моя теория состоит в том, что я делаю что-то не так, но несколько дней назад я просто не могу найти никакого решения.