Ef Core 3.1 и фреймворк Identity, сочетающий контекст БД

Я пытаюсь объединить контекст моего приложения с контекстом базы данных. Я пробовал различные решения, но ни одно из них не работает для ef core 3.1.

public class AppManagerDBContext : IdentityDbContext
{
    public AppManagerDBContext(DbContextOptions options) : base(options) { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("name=DefaultConnection");
        }
    }

    public DbSet<BmiInformation> BmiInformation { get; set; }
    public DbSet<WorkOuts> WorkOuts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BmiInformation>().ToTable("BmInformation");            
    }
}

Это полная ошибка, которую я получаю. Я думал, что все, что мне нужно сделать, это унаследовать от IdentityDbContext. Есть ли что-то еще, что мне нужно сделать в .NET Core 3.1 и EF Core?

Add-Migration MyFirstMigration -Context AppManagerDBContext
Build started...
Build succeeded.

Ошибка

Конструктор AppManagerDBContext должен быть DbContextOptions. При регистрации нескольких типов DbContext убедитесь, что конструктор для каждого типа контекста имеет параметр DbContextOptions, а не неуниверсальный параметр DbContextOptions.

Изменить 1 Хорошо, я решил проблему со следующим, но теперь получаю новую ошибку.

Мой класс информации о пользователе

public class UserInfo : IdentityUser
{
    // These two new fields are added here
    [PersonalData]
    public string Name { get; set; }
    [PersonalData]
    public DateTime DOB { get; set; }
}

Ошибка 2

Тип объекта IdentityUserLogin требует определения первичного ключа. Если вы намеревались использовать тип сущности без ключа, вызовите HasNoKey ().


person csharpdudeni77    schedule 15.05.2020    source источник


Ответы (1)


Вы должны ввести объект DbContextOptions в свой DbContext, параметр типа которого должен соответствовать типу объекта, в который вы вводите.

В твоем случае

public class AppManagerDBContext : IdentityDbContext
{
    public AppManagerDBContext(DbContextOptions<AppManagerDBContext> options) : base(options) { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // ...
    }

    // ...
}

Обе ошибки вполне объяснимы.

Вы должны пометить одно или несколько свойств своей сущности как первичный ключ.
Если хотите, попробуйте

public class UserInfo : IdentityUser
{
    // DatabaseGenerated is optional.
    // Only in case you want to delegate the key generation
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [PersonalData]
    public string Name { get; set; }
    [PersonalData]
    public DateTime DOB { get; set; }
}

Или, если вы не хотите, настройте объект как без ключа.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BmiInformation>().ToTable("BmInformation");
    modelBuilder.Entity<UserInfo>(u =>
    {
        u.HasNoKey();
    });           
}

Надеюсь, это поможет.

person VRoxa    schedule 15.05.2020
comment
См. Правку 2 выше. Я исправил эту проблему. Ваш ответ пришел после моего редактирования, но теперь возникла вторая проблема. См. Ошибку 2. - person csharpdudeni77; 15.05.2020
comment
Спасибо, что был неадекватным ответом. Я думал, что это так же просто, как ключ, но не был уверен, что я, хотя UserInfo только что добавил в существующие пользовательские таблицы, это не так? - person csharpdudeni77; 15.05.2020
comment
В зависимости от стратегии вашей организации и того, что вы зарегистрировали в DbContext как DbSet<> - person VRoxa; 15.05.2020
comment
Не могли бы вы привести пример того, как я бы расширил его, я хочу сохранить информацию профиля, такую ​​как лайки, в таблице пользователей. - person csharpdudeni77; 15.05.2020
comment
Я предлагаю вам прочитать эту статью, где объясняются три стратегии полиморфизма сущностей в Entity Framework. Однако для этого нет встроенного универсального решения, мне придется выбирать то, что подходит в вашем случае. - person VRoxa; 15.05.2020
comment
Рад это слышать. - person VRoxa; 15.05.2020