Entity framework 通过Entity Framework 5与Oracle 11g对话,为每个会话执行SQL Alter命令

Entity framework 通过Entity Framework 5与Oracle 11g对话,为每个会话执行SQL Alter命令,entity-framework,oracle11g,entity-framework-5,dbcontext,entityframework,ef6,oracle,session,Entity Framework,Oracle11g,Entity Framework 5,Dbcontext,Entityframework,Ef6,Oracle,Session,我需要在每个数据库会话开始时执行一些SQL命令。我正在通过DbContext使用EntityFramework5与Oracle 11g数据库通信 我想执行: ALTER SESSION SET NLS_COMP=ANSI; ALTER SESSION SET NLS_SORT=BINARY_CI; 在会话创建开始时进行不区分大小写的搜索。 我该怎么做才好呢 我已经将这些命令放在dbContext的构造函数中,但是只有简单的单元测试,而且看起来确实有效。但不确定这样做是否正确 public pa

我需要在每个数据库会话开始时执行一些SQL命令。我正在通过DbContext使用EntityFramework5与Oracle 11g数据库通信

我想执行:

ALTER SESSION SET NLS_COMP=ANSI;
ALTER SESSION SET NLS_SORT=BINARY_CI;
在会话创建开始时进行不区分大小写的搜索。
我该怎么做才好呢

我已经将这些命令放在dbContext的构造函数中,但是只有简单的单元测试,而且看起来确实有效。但不确定这样做是否正确

public partial class Entities : DbContext
{
    public Entities()
        : base("name=Entities")
    {
        this.Database.ExecuteSqlCommand("ALTER SESSION SET NLS_COMP=ANSI");
        this.Database.ExecuteSqlCommand("ALTER SESSION SET NLS_SORT=BINARY_CI");
    }
}

另一个选项是“模式上的登录触发器”。但您是否强制DBA创建它还是有疑问的。登录触发器被认为是“危险的”。

如果有人正在阅读此内容,则不,正确的方法是在连接打开时执行此操作,并在以下行中触发:

public Entities()
    : base("name=Entities")
{        

    ctx.Database.Connection.StateChange += Connection_StateChange;
    ...
}

    private void Connection_StateChange(object sender, StateChangeEventArgs e)
    {
        if (e.OriginalState == ConnectionState.Open || e.CurrentState != ConnectionState.Open)
            return;

       this.Database.ExecuteSqlCommand("ALTER SESSION SET NLS_COMP=ANSI");

    }

您可以使用Database.Connection.StateChange方法

    public AtomContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
        this.Database.Connection.StateChange += Connection_StateChange;
    }

    void Connection_StateChange(object sender, StateChangeEventArgs e)
    {
        if (e.OriginalState == ConnectionState.Open || e.CurrentState != ConnectionState.Open)
            return;

        IDbConnection connection = ((EntityConnection)((IObjectContextAdapter)this).ObjectContext.Connection).StoreConnection;
        using (IDbCommand command = connection.CreateCommand("ALTER SESSION SET NLS_LANGUAGE=TURKISH"))
            command.ExecuteNonQuery();

        using (IDbCommand command = connection.CreateCommand("ALTER SESSION SET NLS_COMP = LINGUISTIC"))
            command.ExecuteNonQuery();

        using (IDbCommand command = connection.CreateCommand("ALTER SESSION SET NLS_SORT=TURKISH_AI"))
            command.ExecuteNonQuery();
    }

感谢您提供替代方案,不幸的是,它无法通过我们的DB政策。