Как правильно настроить `services.AddDbContext` метода` ConfigureServices` - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь запустить веб-приложение .NET Core с EF Core. Чтобы протестировать репозиторий, я добавил MyDbContext, который наследует EF DbContext и интерфейс IMyDbContext.

public interface ICalendarDbContext
{
    DbSet<MyModel> Models { get; set; }
}

public class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public virtual DbSet<MyModel> Models { get; set; }
}

Контекстный интерфейс добавлен в мой общий репозиторий:

public class GenericRepository<TEntity> : IGenericRepository<TEntity>
{
    private readonly IMyDbContext _context = null;

    public GenericRepository(IMyDbContext context)
    {
        this._context = context;
    }
}

Когда я использую этот код (без интерфейса) в файле startup.cs:

services.AddDbContext<MyDbContext>(options =>
     options.UseSqlServer(...));

Я получаю ошибку во время выполнения:

InvalidOperationException: невозможно разрешить службу для типа 'IMyDbContext' при попытке активировать 'GenericRepository`1 [MyModel]'

А при использовании этой строки кода:

services.AddDbContext<IMyDbContext>(options =>
     options.UseSqlServer(...));

Я получаю код ошибки скомпилированного времени:

Невозможно преобразовать лямбда-выражение в тип 'ServiceLifetime', поскольку оно не тип делегата

У меня вопрос, как правильно настроить метод services.AddDbContext из ConfigureServices? (Есть ли какие-либо изменения, необходимые внутри метода Configure?) При необходимости я готов изменить IMyDbContext

Ответы [ 2 ]

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

Используйте одну из перегрузок , имеющую 2 аргумента универсального типа, которые позволяют вам указать как интерфейс / класс службы, который вы хотите зарегистрировать, так и производный класс DbContext, реализующий его.

Например:

services.AddDbContext<ICalendarDbContext, CalendarDbContext>(options =>
     options.UseSqlServer(...));
0 голосов
/ 10 июня 2019

Только что нашел ответ:

Мне не хватало добавления области между IMyDbContext и MyDbContext.

public void ConfigureServices(IServiceCollection services)
{                    
    services.AddDbContext<MyDbContext>(options => options.UseSqlServer(...));
    services.AddScoped<IGenericRepository<MyModel>, GenericRepository<MyModel>>();
    services.AddScoped<IMyDbContext, MyDbContext>();
}
...