У меня проблема с моим приложением .NET Core 2.2. Я добавил аутентификацию и пользовательский объект в свое приложение, и теперь мое приложение выдает исключения при запуске. Когда я пытаюсь добавить миграции, возникает другое исключение.
Когда я пытаюсь добавить начальную миграцию:
The seed entity for entity type 'AppUser' cannot be added because the value provided for the property 'Id' is not of the type 'int'. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the involved property values.
Когда я пытаюсь запустить свое приложение:
The seed entity for entity type 'AppUser' cannot be added because the value '95ee39c2-a865-4272-8b67-da590fb4b80c' provided for the property 'Id' is not of the type 'int'.
Я не знаю, что я сделал не так. Я пытался изменить это и это в течение нескольких часов, но безуспешно.
Startup.cs -- метод ConfigureServices
services.AddDbContext<ResumeContext>(options =>
options
.UseSqlServer(Configuration.GetConnectionString("ResumeConnection"))
.EnableSensitiveDataLogging()
);
var builder = services.AddIdentityCore<AppUser>(o =>
{
o.Password.RequireDigit = false;
o.Password.RequireLowercase = false;
o.Password.RequireUppercase = false;
o.Password.RequireNonAlphanumeric = false;
o.Password.RequiredUniqueChars = 0;
o.Password.RequiredLength = 6;
});
builder = new IdentityBuilder(builder.UserType, typeof(AppRole), builder.Services);
builder.AddEntityFrameworkStores<ResumeContext>().AddDefaultTokenProviders();
SeedData.cs
public static class SeedData
{
public static IWebHost SeedAdminUser(this IWebHost webHost)
{
using (var scope = webHost.Services.CreateScope())
{
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<AppUser>>();
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<AppRole>>();
if (userManager.Users.Any(u => u.Email == "[email protected]")) return webHost;
roleManager.CreateAsync(new AppRole { Name = AppRole.Admin }).Wait();
userManager.CreateAsync(new AppUser { UserName = "Admin", Email = "[email protected]" }, "CCZtE2XpqXbSs5B").Wait();
userManager.AddToRoleAsync(userManager.FindByEmailAsync("[email protected]").Result, AppRole.Admin).Wait();
}
return webHost;
}
}
AppUser.cs
public class AppUser : IdentityUser<int>
{
// TODO: This will be extended in future
}
Пользователь.cs
public class User
{
public int Id { get; set; }
public int AppUserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string PostalCode { get; set; }
public DateTime CreationDate { get; set; }
public DateTime? ModifyDate { get; set; }
public long? FacebookId { get; set; }
public AppUser AppUser { get; set; }
}
Программа.cs
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.Build()
.SeedAdminUser()
.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Контекст.cs
public class ResumeContext : IdentityDbContext<AppUser, AppRole, int>
{
public ResumeContext(DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configure("Resume.Infrastructure.Data");
}
}
Кто-нибудь знает, что я делаю неправильно? А как правильно настроить удостоверение и сид админа пользователя?
Убедитесь, что ваш ResumeContext
унаследован от IdentityDbContext
, который использует IdentityUser<int>
.
Вы можете найти пример настройки пользовательского IdentityDbContext
с int
на основе IDs
здесь: Ваш контекст БД на основе удостоверений должен выглядеть так
Ваш класс контекста БД должен выглядеть как общедоступный класс MyDbContext : IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken> { ... } - полный код есть stackoverflow.com/questions/52347535/…
Действительно? Мне нужно создать все эти классы, такие как UserClaim, RoleClaim, и использовать наследование от: IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>. Выглядит очень, очень странно :/
Ну, все эти классы вполне связаны. Поэтому имеет смысл определить пользовательские, чтобы получить полный контроль над настройкой логики в контексте БД. По возможности вы можете использовать базовые классы из стандартных пространств имен.
Я отредактировал свой пост и добавил класс Context. Я считаю, что он настроен правильно. Спасибо за быстрый отзыв :)