Entity Framework Coreの接続データベースでイベントを起動できますか?

c# entity-framework-core postgresql

質問

私は私のPostgreSQL DBにアクセスするすべての作業と1つのDbContextを持っていますが、接続セッションがDBで始まるとき、私は小さなSQLコマンドを実行する必要があります。私はすべての相互作用のためにこれを行う必要があります。具体的には、ユーザー名を記録したセッション変数を設定する関数です。

EFコアでそれを処理するために何かをすることは可能ですか?

- 溶液 -

私はbricelamのようにOnConfiguringで直接接続を指定できることに気づいていませんでした。セッションごとに変数があるので、すべての接続でこれを行う必要があります。これはデータベースのユーザー名ではなく、アプリケーションログシステムのユーザー名です。

    public ContratoInternetDbContext(DbContextOptions<ContratoInternetDbContext> options, 
        IOptions<AppSettings> configs)
        : base(options)
    {
        _appSettings = configs.Value;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var conn = new NpgsqlConnection(_appSettings.ConnectionString);
        conn.StateChange += (snd, e) =>
        {
            if ((e.CurrentState != e.OriginalState) && (e.CurrentState == ConnectionState.Open))
            {
                _cmmSetVarSession.ExecuteNonQuery();
            }
        };

        optionsBuilder.UseNpgsql(conn);

        _cmmSetVarSession = conn.CreateCommand();
        _cmmSetVarSession.CommandText = "select sessao_set_var('usuario', 'CENTRAL_CLIENTE')";
    }

受け入れられた回答

DbContext接続を渡してStateChangeイベントをフックすることで、これを行うことができるはずです:(SQLiteの例をStateChangeないでください。私はあなたがPostgreSQLを言ったことを知っています)

var connection = new SqliteConnection(connectionString);
_connection.StateChange += (sender, e) =>
{
    if (e.OriginalState != ConnectionState.Open)
        return;

    var senderConnection = (DbConnection)sender;

    using (var command = senderConnection.CreateCommand())
    {
        command.Connection = senderConnection;
        command.CommandText = "-- TODO: Put little SQL command here.";

        command.ExecuteNonQuery();
    }
};

optionsBuilder.UseSqlite(connection);


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ