3 votes

Comment configurer correctement le `services.AddDbContext` de la méthode `ConfigureServices`

Je suis en train d'essayer de faire fonctionner une application Web .NET Core avec EF Core. Pour tester le dépôt, j'ai ajouté un MyDbContext qui hérite du DbContext d'EF et de l'interface IMyDbContext.

public interface IMyDbContext
{
    DbSet Models { get; set; }
}

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

    public virtual DbSet Models { get; set; }
}

L'interface du contexte est injectée dans mon dépôt générique :

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

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

Quand j'utilise ce code (sans l'interface) dans startup.cs :

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

Je reçois une erreur d'exécution :

InvalidOperationException: Impossible de résoudre le service de type 'IMyDbContext' lors de la tentative d'activation de 'GenericRepository`1[MyModel]'

Et lorsque j'utilise cette ligne de code :

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

Je reçois ce code d'erreur de compilation :

Impossible de convertir l'expression lambda en type 'ServiceLifetime' car ce n'est pas un type de délégué

Ma question est comment configurer correctement le services.AddDbContext de la méthode ConfigureServices ? (Y a-t-il des changements nécessaires à l'intérieur de la méthode Configure ?) Si nécessaire, je suis prêt à modifier l'IMyDbContext

5voto

Ivan Stoev Points 1156

Utilisez l'une des surcharges ayant 2 arguments de type générique, qui vous permettent de spécifier à la fois l'interface/classe de service que vous voulez enregistrer ainsi que la classe dérivée de DbContext l'implémentant.

Par exemple:

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

2voto

Shahar Shukrani Points 522

Vient de trouver la réponse:

J'avais oublié d'ajouter la portée entre IMyDbContext et MyDbContext.

public void ConfigureServices(IServiceCollection services)
{                    
    services.AddDbContext(options => options.UseSqlServer(...));
    services.AddScoped, GenericRepository>();
    services.AddScoped();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X