Разделение IdentityDbContext и DbContext - нужно ли?

349
11 мая 2017, 10:11

Вопрос заключается в следующем. Я пишу небольшое приложение на .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.

Answer 1

Разделение на два контекста не даст большого прироста производительности. Я бы использовал единственный класс 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);
}
READ ALSO
данные из бд в лист

данные из бд в лист

Подскажите, пожалуйста, как данные из определенного столбца таблицы преобразовать в лист

327
Как задать значение для переменной типа string от пользователя

Как задать значение для переменной типа string от пользователя

Как в C# можно задать значение для string, что бы пользователь при работе с программой ввел к примеру свое имя в эту переменнуюВ С++ у меня получалось...

335
Неравномерный сдвиг окна WPF

Неравномерный сдвиг окна WPF

Как сделать растягивание повсеместно и "адекватно"? (чтобы и элементы увеличивались)

236