EF6 TPH 与 Oracle
EF6 TPH with Oracle
我目前在尝试首先使用 EF6 代码映射现有 Oracle 数据库并创建 Table 每个层次结构时遇到一些问题。我要映射的 table 的脚本是这样的:
CREATE TABLE TST.DATABASECON
(
DATABASEID NUMBER NOT NULL,
CN_DATASOURCE VARCHAR2(60 BYTE) NOT NULL,
CN_CATALOG VARCHAR2(60 BYTE),
CN_USERNAME VARCHAR2(60 BYTE),
CN_PASSWORD VARCHAR2(60 BYTE),
CN_INTEGRATED NUMBER DEFAULT 0,
CN_PROVIDER NUMBER DEFAULT 0,
);
它是包含数据库连接信息的 Oracle 服务器上的 table - 每个 Oracle 数据库信息都有一个 CN_PROVIDER = 0 而 SQL 数据库信息有一个 CN_PROVIDER = 1.
因此,我很自然地使用
映射此层次结构
modelBuilder.Entity<ReportConnection>()
.Map<SqlConnection>(m => m.Requires("CN_PROVIDER").HasValue((int)1))
.Map<OracleConnection>(m => m.Requires("CN_PROVIDER").HasValue((int)0));
但是,当我尝试访问数据时,总是出现以下错误:
(60,12) : error 2016: Condition can not be specified
on values of member 'CN_PROVIDER'. Value conditions
are not supported for type 'OracleEFProvider.number'.
我已经尝试使用以下方法来映射它:
Requires("CN_PROVIDER").HasValue((Int16)1)
Requires("CN_PROVIDER").HasValue((Int32)1)
Requires("CN_PROVIDER").HasValue((Int64)1)
Requires("CN_PROVIDER").HasValue((decimal)1)
Requires("CN_PROVIDER").HasValue((Decimal)1)
我已经无计可施了 - 有谁知道如果:
1- 是否可以使用数字列作为鉴别器在 Oracle 中实施 TPH?
2-我错过了什么吗?
现在我将继续(并在我的存储库层上使用工厂实现层次结构)但我愿意尝试提出的任何解决方案 - 提前致谢!
将您的 NUMBER 列声明为 NUMBER(9),EF 会将它们映射为 int。通过不声明大小,EF 可能会将它们映射到 FLOAT...
CREATE TABLE TST.DATABASECON
(
DATABASEID NUMBER NOT NULL,
CN_DATASOURCE VARCHAR2(60 BYTE) NOT NULL,
CN_CATALOG VARCHAR2(60 BYTE),
CN_USERNAME VARCHAR2(60 BYTE),
CN_PASSWORD VARCHAR2(60 BYTE),
CN_INTEGRATED NUMBER(9) DEFAULT 0,
CN_PROVIDER NUMBER(9) DEFAULT 0,
);
看起来正确的选择是对 HasValue() 方法使用 string
Requires("CN_PROVIDER").HasValue("1")
我在使用数字列作为鉴别器时也遇到了同样的问题。我使用的解决方案也应该适用于您。根据使用以下代码:
modelBuilder.Entity<ReportConnection>()
.Map<SqlConnection>(m => m.Requires("CN_PROVIDER").HasValue(1).HasColumnType("int"))
.Map<OracleConnection>(m => m.Requires("CN_PROVIDER").HasValue(0).HasColumnType("int"));
如您所见,只需指定列类型。这对我有用。
我目前在尝试首先使用 EF6 代码映射现有 Oracle 数据库并创建 Table 每个层次结构时遇到一些问题。我要映射的 table 的脚本是这样的:
CREATE TABLE TST.DATABASECON
(
DATABASEID NUMBER NOT NULL,
CN_DATASOURCE VARCHAR2(60 BYTE) NOT NULL,
CN_CATALOG VARCHAR2(60 BYTE),
CN_USERNAME VARCHAR2(60 BYTE),
CN_PASSWORD VARCHAR2(60 BYTE),
CN_INTEGRATED NUMBER DEFAULT 0,
CN_PROVIDER NUMBER DEFAULT 0,
);
它是包含数据库连接信息的 Oracle 服务器上的 table - 每个 Oracle 数据库信息都有一个 CN_PROVIDER = 0 而 SQL 数据库信息有一个 CN_PROVIDER = 1.
因此,我很自然地使用
映射此层次结构modelBuilder.Entity<ReportConnection>()
.Map<SqlConnection>(m => m.Requires("CN_PROVIDER").HasValue((int)1))
.Map<OracleConnection>(m => m.Requires("CN_PROVIDER").HasValue((int)0));
但是,当我尝试访问数据时,总是出现以下错误:
(60,12) : error 2016: Condition can not be specified
on values of member 'CN_PROVIDER'. Value conditions
are not supported for type 'OracleEFProvider.number'.
我已经尝试使用以下方法来映射它:
Requires("CN_PROVIDER").HasValue((Int16)1)
Requires("CN_PROVIDER").HasValue((Int32)1)
Requires("CN_PROVIDER").HasValue((Int64)1)
Requires("CN_PROVIDER").HasValue((decimal)1)
Requires("CN_PROVIDER").HasValue((Decimal)1)
我已经无计可施了 - 有谁知道如果: 1- 是否可以使用数字列作为鉴别器在 Oracle 中实施 TPH? 2-我错过了什么吗?
现在我将继续(并在我的存储库层上使用工厂实现层次结构)但我愿意尝试提出的任何解决方案 - 提前致谢!
将您的 NUMBER 列声明为 NUMBER(9),EF 会将它们映射为 int。通过不声明大小,EF 可能会将它们映射到 FLOAT...
CREATE TABLE TST.DATABASECON
(
DATABASEID NUMBER NOT NULL,
CN_DATASOURCE VARCHAR2(60 BYTE) NOT NULL,
CN_CATALOG VARCHAR2(60 BYTE),
CN_USERNAME VARCHAR2(60 BYTE),
CN_PASSWORD VARCHAR2(60 BYTE),
CN_INTEGRATED NUMBER(9) DEFAULT 0,
CN_PROVIDER NUMBER(9) DEFAULT 0,
);
看起来正确的选择是对 HasValue() 方法使用 string
Requires("CN_PROVIDER").HasValue("1")
我在使用数字列作为鉴别器时也遇到了同样的问题。我使用的解决方案也应该适用于您。根据使用以下代码:
modelBuilder.Entity<ReportConnection>()
.Map<SqlConnection>(m => m.Requires("CN_PROVIDER").HasValue(1).HasColumnType("int"))
.Map<OracleConnection>(m => m.Requires("CN_PROVIDER").HasValue(0).HasColumnType("int"));
如您所见,只需指定列类型。这对我有用。