3

我有一种情况,我需要在读写事件发生之前设置 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

2

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 在这个 sub 之后打开了连接,所以我现在还不能对它执行命令。

4

1 回答 1

1

当连接状态从关闭变为打开时,您可以尝试这样做。像这样...

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();
            }
        }
    }
于 2013-12-12T00:44:25.863 回答