2017-03-03 5 views
-1

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

EFコアでこれを処理するには何かできますか?

--SOLUTION--

私は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')"; 
    } 
+1

は次のように聞こえますXY問題:あなたはYのやり方を尋ねていますが、問題は以前に選択されたパスXにあります。なぜこのユーザー名を設定する必要がありますか、どのように使いたいのですか?接続が開かれるまでの時間*?現在のところ、この質問に答えるには十分な文脈が欠けています。 –

+0

私はあなたがこの問題を解決できると思いますStateClangeイベントのDbContextデータベースプロパティにイベントハンドラを追加 –

答えて

1

あなたのDbContextへの接続を渡すとStateChangeイベントフックでそれを行うことができるはずです(私はあなたがPostgreSQLの言っ知っているSQLiteの例をご容赦下さい。)を

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); 
関連する問題