Вопрос заключается в следующем. Я пишу небольшое приложение на .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);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите, пожалуйста, как данные из определенного столбца таблицы преобразовать в лист
Как в C# можно задать значение для string, что бы пользователь при работе с программой ввел к примеру свое имя в эту переменнуюВ С++ у меня получалось...
Как сделать растягивание повсеместно и "адекватно"? (чтобы и элементы увеличивались)