EF6 TPH与Oracle

时间:2015-06-30 14:18:53

标签: oracle numbers entity-framework-6 discriminator tph

我在尝试首先使用EF6代码映射现有Oracle数据库并创建Table Per Hierarchy时遇到了一些问题。我要映射的表格的脚本如下:

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-是否可以使用Number列作为鉴别器在Oracle中实现TPH? 我错过了什么吗?

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

3 个答案:

答案 0 :(得分:3)

使用Numeric列作为Discriminator时,我也遇到了同样的问题。我用过的解决方案也应该适合你。根据它使用以下代码:

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

您可以注意到,只需指定列类型即可。这对我有用。

答案 1 :(得分: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,
);

答案 2 :(得分:1)

看起来正确的选项是使用字符串作为HasValue()方法

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