web-dev-qa-db-fra.com

Différence entre adddbcontext et adddbcontextFactory

En fait j'ai commencé avec Blazor et EF Core. Lors de l'enregistrement du DbContext je suis sangtité. Le DbContext peut être enregistré avec AddDbContext ou avec AddDbContextFactory. Mais quelle est la différence?

builder.Services.AddDbContext<DataContext>(opt => opt.UseSqlServer("..."));
builder.Services.AddDbContextFactory<DataContext>(opt => opt.UseSqlServer("..."));

De Docs, j'ai obtenu les informations suivantes:

AddDbContext:

Utilisez cette méthode lors de l'utilisation d'une injection de dépendance ...

Entity Framework Core ne prend pas en charge plusieurs opérations parallèles étant exécutées sur la même instance Microsoft.EntyTityFrameworkCore.DBContext. Cela inclut à la fois une exécution parallèle des requêtes ASYNC et toute utilisation concomitante explicite de plusieurs threads.

AddDbContextFactory:

L'enregistrement d'une usine est recommandé pour les applications de blazor et d'autres situations où la portée d'injection de dépendance n'est pas alignée sur le contexte de la vie ...

Pour plus de commodité, cette méthode enregistre également le contexte le type de contexte en tant que service scopé. Cela permet de résoudre une instance de contexte à partir d'une périmètre d'injection de dépendance directement ou créée par l'usine, selon le cas.

Alors pouvons-nous dire globalement que si le programme a besoin d'accéder à DbContext de différents threads ou en même temps, il est nécessaire d'enregistrer le contexte avec AddDbContextFactory parce que lorsqu'il est créé (par exemple dans le contrôleur ) Le lifge est réglé sur Frotté et donc nous recevons chaque fois un nouveau DbContext?

private readonly DataContext _dbContext;

public BlogController(IDbContextFactory<DataContext> dbFactory)
{
  // Will be created as SCOPED DbContext?
  _dbContext = dbFactory.CreateDbContext();
}

J'ai aussi trouvé une question similaire ici . Et là la vie dans la vie de AddDbContext et AddDbContextFactory est définie lors de l'enregistrement. Ou je manque quelque chose.

Donc, ma question est généralement:

  • Lorsque vous utilisez AddDbContextFactory au lieu de AddDbContext?
  • Quelle est la différence de vie à partir de DbContext entre DbContextFactory et AddDbContext?
  • Devrais-je généralement utiliser DbContextFactory pour Blazor projets?
  • Y a-t-il une mémoire de mémoire lorsque DbContext est créé dans une vie scoped vie?
3
sunriax

PROFESSIONS: Nous aimons que la durée de vie d'un dBContext soit aussi courte que possible.

Pour une application Server HTTP, nous avons la portée d'un cycle de demande/réponse. C'est idéal, problème résolu: injecter un dbcontext scopé.

Pour une application de serveur Blazor, comme avec Winforms et WPF, nous n'avons pas de tellement convenables. Nous devons donc gérer le dBContext plus directement.

Vous pouvez utiliser la durée de vie d'un formulaire (page), avec Idisposable et/ou propriétaireComponTébase mais cette vie est généralement trop longue.

Donc, le fardeau se déplace vers les référentiels (et/ou services): ils doivent gérer le DBContext sur une base de méthode. C'est là que la DBContextFactory est disponible: vous pouvez simplement injecter l'usine, mais chaque méthode ressemble à:

void DoSomething()
{
   using (var ctx = _factory.CreateContext())
   {
     ...
   }
}

Une application Blazor Webassembly n'utilisera pas directement un dBContext, de sorte que ce qui précède s'applique principalement au serveur Blazor.

1
Henk Holterman

Lorsque vous utilisez adddbContextFactory au lieu d'adddbcontext?

Dans Blazor, utilisez toujours le dBContextFactory. Mais cela dit que je suis sûr que quelqu'un va venir avec une exception!

Quelle est la différence de vie à partir de DBContext entre DBContextFactory et AddDBContext?

La DBContextFactory gère le cycle de vie de ses dBContexts. L'application du principe "unité de travail" et le cycle de vie est celui de l'unité de travail. Si vous ajoutez le contexte directement au conteneur DI, par exemple avec AddDbContext, alors il vit pour la durée de vie du conteneur DI.

Devrais-je généralement utiliser DBContextFactory pour les projets BLAZOR?

Déjà répondu ci-dessus

Y a-t-il une surcharge de mémoire lorsque DBContext est créé dans une durée de vie cachée?

Bien sûr. La mémoire est utilisée par des objets non exposés. Un dBContext Scoped vit pour la durée de vie du conteneur di. Disposez-vous ne s'appelle pas sur des objets dans le conteneur jusqu'à ce que le conteneur lui-même soit détruit. C'est pourquoi vous n'utilisez jamais de DBContexts transitoires. Ils ne sont pas disposés avant la destruction du conteneur de session DI.

1