Вопрос заключается в следующем. Я пишу небольшое приложение на .NET Core WEB API. И решил присоединить систему идентификации Identity. Но его присоединение требует создание контекста, который наследуется от IdentityDbContext. Но я уже использую свой контекст для остальной бд, который наследуется от DbContext.
Но вопрос состоит в следующем - как правильно делать ? Нужно добавлять Identity таблицы в существующую БД (т.е. мы от него будет наследоваться и пихать все в один контекст) или все таки стоит разделить на 2 контекста? И как тогда в случае двух контекстов создавать взаимодействие Identity и остальных таблиц ( в моей задаче я захотел расширить класс User и проставить свои роли).
Буду благодарен за ссылки на толковые ресурсы.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("YourContextName")
{
}
public DbSet<UserModel> Users { get; set; } // т.е. тут свои модели, не связанные с идентити
}
Update
По сути я хочу чтобы у меня был свой класс для Ролей, наследуемый от IdentityRole модели ролей ( нужны дополнительные поля помимо тех, что предлагает Identity) и свой класс User, который наследуется от IdentityUser.
Разделение на два контекста не даст большого прироста производительности. Я бы использовал единственный класс AppDbContext, наследующий от IdentityDbContext. В IdentityDbContext очень мало накладных расходов, это в основном обычный DbContext с несколькими DbSet<>. Если необходимо ограничить функциональность, разделяя на два контекста, то можно воспользоваться интерфейсами.
Что касается типа ключа для классов, то в этом случае используется несколько иная перегрузка IdentityDbContext. Приведу небольшой пример.
Для начала создам кастомные классы сущностей, чтобы не использовать длинные конструкции, вроде : IdentityUser<Guid, IdentityUserLogin<Guid> .... Это необходимо, потому что мы используем другой тип ключа (Guid).
UserClaim
public class UserClaim : IdentityUserClaim<Guid> { }
UserLogin
public class UserLogin : IdentityUserLogin<Guid> { }
UserRole
public class UserRole : IdentityUserRole<Guid> { }
Role.
В качестве примера, расширим класс.
public class Role : IdentityRole<Guid, UserRole>
{
public string Field1 { get; set; }
}
User
public class User : IdentityUser<Guid, UserLogin, UserRole, UserClaim> {}
Сам контекст.
public class AppDbContext : IdentityDbContext<User, Role, Guid, UserLogin, UserRole, UserClaim>
В контексте переопределяем метод OnModelCreating и настраиваем наши поля.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Role>()
.Property(x => x.Field1)
.IsRequired();
modelBuilder.Entity<UserClaim>()
.Property(x => x.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Role>()
.Property(x => x.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники