ASP.Net Core WebAPI Entity Framework - Execute Sql Command on Startup

Messages postés
3
Date d'inscription
mercredi 17 avril 2019
Statut
Membre
Dernière intervention
10 mai 2019
-
Dans mon WebAPI ASP.Net Core, je souhaite définir le démarrage de SESSION_CONTEXT de SQL pour le dépôt de l’ID utilisateur de l’utilisateur connecté. J'utilise la sécurité au niveau de la ligne sur MS SQL Server 2016 pour limiter les données dépendant de l'ID utilisateur de SESSION_CONTEXT.

J'ai des problèmes pour exécuter une commande SQL au démarrage ou plutôt lors du StateChange de mon DbContext. Je ne sais pas comment ajouter mon code à StateChange-Event. Peut-être y a-t-il aussi une meilleure façon de faire cela.

Je travaille avec Microsoft.EntityFrameworkCore 2.1.0. J'ai déjà essayé cet exemple: https://www.carlrippon.com/creating-a-multi-tenant-asp-net-core-web-api-with-sql-server-rls/

J'ai échoué car l'exemple est fait pour EF 1 et ne fonctionne pas avec la version 2, l'erreur suivante s'affiche au démarrage:

InvalidOperationException: Impossible de résoudre le service défini 'DataContext' à partir du fournisseur racine. https://www.dqfanfeedback.xyz/

J'ai encore un problème pour obtenir la connexion sur DbContext "OnConfiguring". La chaîne de connexion se trouve dans le fichier appsettings.json et je l'utilise au démarrage. N'est-il pas possible d'obtenir la chaîne de connexion de DbContext OnConfiguring? Le code au démarrage (UseSqlServer ()) se déclenche avant OnConfiguring, la chaîne de connexion doit donc se situer quelque part ...

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    var connectionString = "<your connection string>";
    connection = new SqlConnection(connectionString);
    connection.StateChange += Connection_StateChange;

    optionsBuilder.UseSqlServer(connection);

    base.OnConfiguring(optionsBuilder);
}

private void Connection_StateChange(object sender, System.Data.StateChangeEventArgs e)
{
    if (e.CurrentState == ConnectionState.Open)
    {
        var cmd = connection.CreateCommand();
        cmd.CommandText = @"exec sp_set_session_context @key=N'TenantId', @value=@TenantId";
        cmd.Parameters.AddWithValue("@TenantId", tenantId);
        cmd.ExecuteNonQuery();
    }
}

Startup.cs:

services.AddDbContext<WfsDbContext>(options =>
{
 options.UseSqlServer(_configuration.GetConnectionString("DefaultConnection"));
});
Afficher la suite