我有一种情况,我需要在读写事件发生之前设置oracle会话变量/上下文(这是客户端的要求,不可协商)。
插入此代码的最佳位置在哪里? 我已经覆盖了DBContext.New()
方法以及出于其他目的的DBContext.OnModelCreating()
,但我无法判断它们中的任何一个是否是整个数据库会话的真正开始(因为 EF 是无状态的......?
很确定实际的代码将是一个简单的Me.Database.SqlQuery()
,只需要确定将其放在哪里即可。
我感知的选择:
1
Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
[Other Code]
MyBase.OnModelCreating(modelBuilder)
Me.Database.ExecuteSqlCommand("SESSIONCOMMAND")
End Sub
阿拉伯数字
Using CTX As New MyContext()
CTX.Database.ExecuteSqlCommand("SESSIONCOMMAND")
[OTHER CODE]
End Using
3
Public Sub New()
MyBase.New(
New OracleConnection(
ConfigurationManager.ConnectionStrings("MyContext").ConnectionString),
True)
Me.Database.ExecuteSqlCommand("SESSIONCOMMAND")
End Sub
我很确定 #3 是不可能的,因为 EF 在此子之后打开连接,因此此时我还无法对它执行命令。
当连接状态从关闭更改为打开时,您可以尝试执行此操作。喜欢这个。。。
public partial class MyContext : DbContext
{
public MyContext()
{
this.Database.Connection.StateChange += Connection_StateChange;
}
void Connection_StateChange( object sender, System.Data.StateChangeEventArgs e )
{
if ( e.CurrentState == System.Data.ConnectionState.Open )
{
if ( sender is System.Data.Common.DbConnection )
{
var command = ( sender as System.Data.Common.DbConnection ).CreateCommand();
command.CommandText = "SESSIONCOMMAND";
command.CommandType = System.Data.CommandType.Text;
command.ExecuteNonQuery();
}
}
}