0

J'utilise [Repository & UOW] Pattern pour fonctionner avec EF Core.Pourquoi DbContext éliminé automatiquement après chaque appel api dans EF Core?

Problème

La plupart du temps, après chaque appel avec succès le contexte est disposé & erreur de lancer.

Méthode d'extension

public static IServiceCollection AddDataAccessConfig<C>(this IServiceCollection services) where C : DbContext 
     { 
      RegisterDataAccess<C>(services); 
      return services; 
     } 
private static void RegisterDataAccess<C>(IServiceCollection services) where C : DbContext 
     { 
      services.TryAddScoped<IUnitOfWork<C>, UnitOfWork<C>>(); 
     } 

ConfigureServices

//Register Context   
      services.AddDataAccessConfig<MyDbContext>(); 
      services.AddDbContext<MyDbContext>(options => 
      { 
       options.UseSqlServer(Configuration.GetConnectionString("DbCon")); 

      }); 
//Register Repository  
      services.TryAddScoped<IUserRepository, UserRepository>(); 

J'ai essayé avec le code ci-dessous. Mais pas de chance

TryAddTransient

services.TryAddTransient<IUserRepository, UserRepository>(); 

Base de dépôt

protected RepositoryBase(IUnitOfWork<C> unitOfWork) 
     { 
      UnitOfWork = unitOfWork; 

      _dbSet = UnitOfWork.GetContext.Set<E>(); // THIS LINE THROW ERROR 

     } 

UOW

public UnitOfWork(C dbcontext) 
     { 
      _dbContext = dbcontext; 
     } 
public C GetContext 
     { 
      get { return _dbContext; } 
     } 

Exemple de service d'appel

public IActionResult ByUser(string uid, string pwd) 
     { 
var result = _userRepository.GetValidUser(uid, pwd); 


        if (string.IsNullOrEmpty(result)) 
        { 
         return Request.CreateResponse(HttpStatusCode.Unauthorized); 
        } 
        else 
        { 
         return Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(result)); 
        } 


} 
+1

Qu'entendez-vous par "après chaque appel"? Montrez-nous le code pour cela et le problème que vous rencontrez. – DavidG

+5

'utiliser [Repository & UOW] Pattern pour travailler avec EF Core' <= Pourquoi? Le type 'DbContext' est une implémentation d'un modèle UoW et le type' DbSet 'est une implémentation d'un modèle Repository. Pourquoi réemballer ces types dans votre propre implémentation du même modèle? Vous n'ajoutez rien de valeur, juste plus de code et d'abstractions qui rendent difficile la lecture, le débogage et l'utilisation des types tels qu'ils étaient destinés à être utilisés. – Igor

+0

@DavidG: J'ai mis à jour mon message –

Répondre

2

Modification de la durée de vie de votre IUserRepository n'affectera pas la durée de vie du DbContext. Il y a un overload de AddDbContext qui vous permet de spécifier la durée de vie du DbContext. par exemple.

services.AddDbContext<MyDbContext>(options => 
{ 
    options.UseSqlServer(Configuration.GetConnectionString("DbCon")); 
}, ServiceLifetime.Transient); 

La valeur par défaut ServiceLifetime.Scoped ne fonctionne vraiment bien si vous êtes dans une application ASP.NET de base. Voir here pour plus d'informations.

+3

Un contexte DB comme un singleton serait une très mauvaise idée. – DavidG

+0

@KirkLarkin: Merci pour votre solution. –

+0

Comment exactement cela a-t-il résolu le problème? –