使用Entity Framework 5和连接Oracle 11g的会话时执行SQL修改命令

4

我有一个需求,在每个数据库会话开始时执行一些SQL命令。我正在使用通过DbContext连接到Oracle 11g数据库的Entity Framework 5。

我想要执行以下命令:

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");
    }
}
3个回答

5
如果有人正在阅读这篇文章,不,正确的做法是在连接打开时触发下面的操作:
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");

    }

2
你可以使用 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();
    }

这是一个包含多个链接的 HTML 段落,其中包括:
- entityframework - ef6 - oracle - dbcontext - session
需要进一步的上下文才能确定这些链接的具体含义。

0
另一个选择是“SCHEMA上的LOGON TRIGGER”。但是强制DBA创建它是否值得商榷。登录触发器被认为是“危险的”。

谢谢提供另一种方案,不幸的是它没有通过我们的数据库策略。 - Jafin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接