【发布时间】:2019-04-25 16:03:14
【问题描述】:
说明:
我使用一个名为 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 告诉我数据库中已经有一个条目那个主键。
每个 PilotTest 都应该引用一个 Pilot。这是数据库中的 PilotTest 表:
我试图在这里只添加一个 Pilot:
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; }
}
我的理论是我做错了什么,但几天前我找不到任何解决方案。
【问题讨论】:
-
通过
await UserManager.CreateAsync(pilot, pilot.Password);查看数据库AspNetUsers中是否有用户。您的方法Seeds.CreateRoles(serviceProvider, configuration).Wait();与public static async Task CreateRoles(IServiceProvider serviceProvider)方法定义不对应。
标签: c# entity-framework asp.net-core-mvc asp.net-identity