Как изменить тип идентификатора пользователя со строки на int в Asp.NET Core 2.2? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть приложение, написанное с использованием C # вверху на Asp.Net Core 2.2.Приложение было написано поверх Core 2.1, но затем обновлено до Asp.net Core 2.2.

Теперь я решил изменить тип Id модели User со строки на целое.

Чтобы переопределить тип string / default, я создал класс Userвот так

public class User : IdentityUser<int>
{
}

Затем я создал класс Role вот так

public class Role : IdentityRole<int>
{
}

Наконец, я обновил класс ApplicationDbContext примерно так

public class ApplicationDbContext : IdentityDbContext<User, Role, int>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

Затем я удалил все таблицы базы данных, которые начинаются с AspNet и таблицу _Migrations.

Теперь, каждый раз, когда я запускаю свое приложение, я получаю следующую ошибку

InvalidOperationException: Нет службыдля типа «Microsoft.AspNetCore.Identity.UserManager`1 [Microsoft.AspNetCore.Identity.IdentityUser]» зарегистрирован.

Вот мой класс Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));


        services.AddDefaultIdentity<User>().AddEntityFrameworkStores<ApplicationDbContext>()
          .AddDefaultTokenProviders();

    services.AddAuthentication()
            .AddFacebook(facebookOptions =>
    {
        facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
        facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
    });

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Я также пытался сделать так, чтобы следующий код в моем файле Startsup

services.AddScoped<UserManager<User>>();

Вот скриншот трассировки стека enter image description here

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Вы обновили свою базу данных?

Если это сделано, то просто измените это

services.AddDefaultIdentity<User>().AddEntityFrameworkStores<ApplicationDbContext>()
      .AddDefaultTokenProviders();

на

services.AddIdentity<User, Role>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultUI()
                .AddDefaultTokenProviders();

И это не нужно.

services.AddScoped<UserManager<User>>();

Просто удалите его.

0 голосов
/ 21 декабря 2018

Вызов AddDefaultIdentity<TUser>() регистрируется UserManager<TUser> в контейнере Dependency Injection.До того, как вы создали свой собственный тип TUser, вы бы использовали здесь IdentityUser, который бы зарегистрировал UserManager<IdentityUser>.

. При переходе с IdentityUser на User выТеперь зарегистрируйтесь UserManager<User> вместо UserManager<IdentityUser>.Сообщение об ошибке из вашего вопроса показывает, что частичное представление в вашем проекте пытается получить экземпляр UserManager<IdentityUser> из контейнера DI, но он должен запрашивать экземпляр UserManager<User> из-за вашего изменения.Это означает, что в частичном представлении потребуются следующие изменения:

@inject UserManager<IdentityUser> UserManager

-becomes-

@inject UserManager<User> UserManager

Это исправит указанную вами ошибку, но вы такженеобходимо просмотреть остальную часть проекта, чтобы увидеть, есть ли какие-либо другие ссылки на UserManager<IdentityUser>, которые также необходимо изменить.

0 голосов
/ 21 декабря 2018

Вам необходимо добавить базу данных миграции и обновления для создания схем:

  1. Определить или обновить модель данных в коде. сделано
  2. Добавьте миграцию, чтобы преобразовать эту модель в изменения, которые можно применить к базе данных.
  3. Убедитесь, что миграция правильно отражает ваши намерения.
  4. Примените миграцию, чтобы обновить базу данных для синхронизации с моделью.
  5. Повторите шаги с 1 по 4, чтобы дополнительно уточнить модель и поддерживать синхронизацию базы данных.

Для созданияМиграции

dotnet ef migrations add InitialCreate 

или

Add-Migration InitialCreate

Для обновления базы данных

dotnet ef database update

или

Update-Database

Вы можете получить более подробную информацию о настройке схемыи переход с Настройка модели идентичности в ASP.NET Core

...