2017-03-03 58 views
-1

我有一个DbContext与所有的工作来访问我的Postgresql数据库,但是当连接会话以数据库启动时,我需要运行一个小小的SQL命令。我需要为每次互动做到这一点。更具体地说,这是一个设置会话变量和用户名记录的功能。我可以在实体框架核心中的连接数据库上触发事件吗?

在EF Core中可以做些什么来处理?

--SOLUTION--

我没有意识到,我可以直接在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')"; 
    } 
+1

听起来像一个XY问题:你问的是如何做Y,但问题出现在选择的路径X.为什么你必须设置这个用户名,你想如何使用它,为什么你必须设置它*每个连接打开的时间*?目前这个问题缺乏足够的上下文来回答。 –

+0

我认为你可以解决这个问题添加一个事件处理程序到你的DbContext数据库属性的StateChange事件 –

回答

1

您应该能够通过传递一个连接到您的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); 
相关问题