ASP.Net Core WebAPI Entity Framework - Выполнить команду Sql при запуске - PullRequest
1 голос
/ 07 мая 2019

В моем ASP.Net Core WebAPI я хотел бы установить SESSION_CONTEXT sql при запуске, чтобы сохранить userId вошедшего в систему пользователя.Я использую безопасность на уровне строк в MS SQL Server 2016, чтобы ограничить данные, зависящие от идентификатора пользователя в SESSION_CONTEXT.

У меня проблемы с выполнением команды sql при запуске, а точнее с StateChange моего DbContext.Я не знаю, как добавить свой код в StateChange-Event.Может быть, есть и лучший способ сделать это.

Я работаю с Microsoft.EntityFrameworkCore 2.1.0.Я уже пробовал этот пример: https://www.carlrippon.com/creating-a-multi-tenant-asp-net-core-web-api-with-sql-server-rls/

Я потерпел неудачу, потому что пример сделан для EF 1 и не работает с версией 2, я получаю следующую ошибку при запуске:

InvalidOperationException:Не удается разрешить службу DataContext с заданной областью от корневого поставщика.

У меня есть еще одна проблема с получением соединения по DbContext "OnConfiguring".Строка подключения находится в файле appsettings.json, и я использую его при запуске.Разве невозможно получить строку подключения из DbContext OnConfiguring?Код при запуске (UseSqlServer ()) запускается перед OnConfiguring, поэтому строка подключения должна быть где-то ...

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"));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...