我可以在Entity Framework Core中的連接數據庫上觸發事件嗎?

c# entity-framework-core postgresql

我有一個DbContext,所有人都在努力訪問我的Postgresql數據庫,但我需要在連接會話啟動時運行一個小的SQL命令。我需要為每次互動都這樣做。更具體地說,它是一個用於設置記錄用戶名的會話變量的函數。

在EF Core中可以做些什麼來處理它?

- 解 -

我沒有意識到我可以直接在OnConfiguring中指定連接,就像bricelam所說的那樣。我需要在每個連接中執行此操作,因為它是會話的變量。它不是數據庫的用戶名,而是應用程序日誌記錄系統的用戶名。

    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示例。我知道你說的是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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow