Ошибка при попытке получить контекст базы данных приложения из IdentityContext - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь получить контекст приложения из IdentityContext, чтобы при извлечении данных я мог использовать только один контекст.

Вот как определяется IdentityContext:

public class IdentityContext : IdentityDbContext<ApplicationUser, ApplicationRole, int> {}

А вот приложениеcontext:

public partial class MyDbContext : IdentityContext
{
        //

        public MyDbContext(DbContextOptions<MyDbContext> options)
    : base(options)
        { }
        //
}

Компилятор жалуется на переменную options:

Error   CS1503  Argument 1: cannot convert from 'Microsoft.EntityFrameworkCore.DbContextOptions<Application.Data.MyDbContext>' to 'Microsoft.EntityFrameworkCore.DbContextOptions<Application.Data.IdentityContext>'    

Если я использую:

public MyDbContext(DbContextOptions<IdentityContext> options)
    : base(options)
        { }

, то при выполнении миграций я получаю ошибки:

λ dotnet ef migrations add InitialCreate

More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.

И:

λ dotnet ef migrations add InitialCreate --context MyDbContext

Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[Application.Data.IdentityContext]' while attempting to activate 'Application.Data.MyDbContext'.

В Startup.cs у меня есть:

 services.AddDbContext<MyDbContext>(
                    options => options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"))
                );
            services.AddIdentity<ApplicationUser, ApplicationBlogRole>().AddEntityFrameworkStores<MyDbContext>()
                .AddDefaultTokenProviders().AddSignInManager<ApplicationSignInManager>();

1 Ответ

2 голосов
/ 11 июня 2019

Ошибка CS1503 Аргумент 1: невозможно преобразовать из «Microsoft.EntityFrameworkCore.DbContextOptions» в «Microsoft.EntityFrameworkCore.DbContextOptions»

Согласно этой информации об ошибке, я полагаю, ваш класс IdentityContext имеет конструктор, который принимает параметр DbContextOptions<IdentityContext> options, как показано ниже:

public class IdentityContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>
{
    public IdentityContext(DbContextOptions<IdentityContext> options) : base(options) 
    { }

    // ...
}

Так что он жалуется, если вы вызываете base(options) в производном контексте:

public partial class MyDbContext : IdentityContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    { }

}

Как решить

Измените конструктор вашего IdentityContext, чтобы получить DbContextOptions options и сделайте конструктор из MyDbContext, чтобы принять DbContextOptions<MyDbContext> options:

public class IdentityContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>
{
    public IdentityContext(<b>DbContextOptions options</b>) : base(options)
    {
    }
}

public partial class MyDbContext : IdentityContext
{
    public MyDbContext(<b>DbContextOptions<MyDbContext> options</b>) : base(options)
    { }

}

Как примечание, вы добавляете службы идентификации с ролью ApplicationBlogRole вместо ApplicationRole:

services.AddIdentity<ApplicationUser, ApplicationBlogRole>()  // it might cause problems in future.

Может быть, это должно быть:

services.AddIdentity<ApplicationUser, ApplicationRole>() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...