【发布时间】:2017-07-24 02:25:26
【问题描述】:
我有一个 DbContext 可以访问我的 Postgresql 数据库,但是当连接会话与数据库开始时,我需要运行一个小的 SQL 命令。我需要为每次交互执行此操作。更具体地说,它是一个设置会话变量并记录用户名的函数。
可以在 EF Core 中做一些事情来处理它吗?
--解决方案--
我没有意识到我可以像 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')";
}
【问题讨论】:
-
听起来是个XY问题:你问怎么做Y,但问题出在前面选择的路径X上。为什么一定要设置这个用户名,你想怎么用它以及为什么您必须设置它每次打开连接时?目前这个问题缺乏足够的背景来回答。
-
我认为你可以解决这个问题,为 StateChange 事件添加一个事件处理程序到你的 DbContext 数据库属性
标签: c# postgresql entity-framework-core