0

我目前在尝试首先使用 EF6 代码来映射现有 Oracle 数据库并为每个层次结构创建一个表时遇到一些问题。我要映射的表的脚本如下所示:

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 服务器上包含数据库连接信息的表 - 每个 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-我错过了什么吗?

现在我将继续(并使用我的存储库层上的工厂实现层次结构)但我愿意尝试提出的任何解决方案 - 在此先感谢!

4

3 回答 3

3

在使用数字列作为鉴别器时,我也遇到了同样的问题。我使用的解决方案也应该对您有用。根据使用以下代码:

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"));

如您所见,只需要指定列类型。这对我有用。

于 2016-06-25T14:49:31.263 回答
1

将您的 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,
);
于 2015-06-30T14:46:25.697 回答
1

看起来正确的选择是对HasValue() 方法使用字符串

Requires("CN_PROVIDER").HasValue("1")

于 2016-03-23T13:07:45.343 回答