在数据上下文中的运行时更改架构名称
Change Schema Name at Runtime in data context
所以,我正在使用 dotConnect for Oracle。我使用模板和向导来创建数据库模型(数据库优先方法)。我们有多个数据库,单个应用程序需要引用这些数据库,不幸的是,包含表的模式命名在其他数据库中并不统一。
在 Designer.cs
文件中自动生成的 class 中,我得到:
[Table(Name = @"FMC_TP.EQUIPMENT")]
但考虑到架构可能是哪个数据库连接:
[Table(Name = @"FMC_DEV.EQUIPMENT"]
有没有办法在运行时更改映射的架构?
在 Oracle 中,您可以调用 alter session set current_schema = SCHEMA_NAME
语句来设置会话上下文。然后,您可以不使用模式名称为表添加前缀,但这只有在您对所有语句使用相同的会话时才有用。
如果有人有类似的问题,我将扩展 Kacper 的回答:
在模型文件 MyModel.lqml
中,我从 table 名称中删除了架构规范:
<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;
还有一种方法可以在建立连接后立即执行命令:通过运行一次命令(或初始化命令)连接字符串参数设置命令(或多个命令)。有关详细信息,请参阅 https://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~ConnectionString.html。
所以,我正在使用 dotConnect for Oracle。我使用模板和向导来创建数据库模型(数据库优先方法)。我们有多个数据库,单个应用程序需要引用这些数据库,不幸的是,包含表的模式命名在其他数据库中并不统一。
在 Designer.cs
文件中自动生成的 class 中,我得到:
[Table(Name = @"FMC_TP.EQUIPMENT")]
但考虑到架构可能是哪个数据库连接:
[Table(Name = @"FMC_DEV.EQUIPMENT"]
有没有办法在运行时更改映射的架构?
在 Oracle 中,您可以调用 alter session set current_schema = SCHEMA_NAME
语句来设置会话上下文。然后,您可以不使用模式名称为表添加前缀,但这只有在您对所有语句使用相同的会话时才有用。
如果有人有类似的问题,我将扩展 Kacper 的回答:
在模型文件 MyModel.lqml
中,我从 table 名称中删除了架构规范:
<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;
还有一种方法可以在建立连接后立即执行命令:通过运行一次命令(或初始化命令)连接字符串参数设置命令(或多个命令)。有关详细信息,请参阅 https://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~ConnectionString.html。