【问题标题】:Change Schema Name at Runtime in data context在数据上下文中在运行时更改模式名称
【发布时间】:2017-04-24 06:01:56
【问题描述】:

所以,我正在使用dotConnect for Oracle。我使用模板和向导来创建数据库模型(数据库优先方法)。我们有多个数据库,单个应用程序需要引用这些数据库,不幸的是,包含这些表的架构命名在其他数据库中并不统一。

Designer.cs 文件中自动生成的类中,我得到:

[Table(Name = @"FMC_TP.EQUIPMENT")]

但考虑到架构可能是哪个数据库连接:

[Table(Name = @"FMC_DEV.EQUIPMENT"]

有没有办法在运行时更改映射的架构?

【问题讨论】:

    标签: c# oracle devart dotconnect


    【解决方案1】:

    在 Oracle 中,您可以调用 alter session set current_schema = SCHEMA_NAME 语句来设置会话的上下文。然后,您可以不使用模式名称为表添加前缀,但这只有在您对所有语句使用相同的会话时才有帮助。

    【讨论】:

    • 我同时使用 4 个不同的模式。所以我想我每次创建会话时都需要更改。值得一试。
    • @FelixCastor 是的,如果在一个会话中您使用来自不同架构的表,您需要多次执行该命令,但它允许您保留没有架构名称的表名,并通过执行多个 alter 动态设置它们
    • 工作就像一个魅力!
    【解决方案2】:

    如果有人有类似的问题,我将扩展 Kacper 的答案:

    在模型文件MyModel.lqml 中,我从表名中删除了模式规范:

    <Table Name="SCHEMA.TABLE" Member="ModelTableName">
    

    <Table Name="TABLE" Member="ModelTableName">
    

    基本上在适用的情况下。

    在代码中:

    MyModelDataContext mycontext = new MyModelDataContext();
    
    mycontext.ExecuteCommand($"ALTER SESSION SET CURRENT_SCHEMA = {Schema}", new object[1]);
    

    然后执行我的查询。

                var rows = from x in mycontext.ModelTableName
                                where x.COLUMN == id
                                select x;
    

    【讨论】:

      【解决方案3】:

      还有一种方法可以在建立连接后立即执行命令:通过 Run Once Command(或 Initialization Command)连接字符串参数设置命令(或多个命令)。更多信息请参考https://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~ConnectionString.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 2018-07-09
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        • 2013-05-15
        • 2016-03-11
        相关资源
        最近更新 更多