【问题标题】:EF6 TPH with OracleEF6 TPH 与 Oracle
【发布时间】:2015-06-30 14:18:53
【问题描述】:

我目前在尝试首先使用 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-我错过了什么吗?

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

【问题讨论】:

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


    【解决方案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"));
    

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

    【讨论】:

      【解决方案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,
      );
      

      【讨论】:

      • 感谢您的回答 - 不幸的是它没有工作......我已经使用新结构创建了一个新表并在两个表之间复制了值(只是为了确保)但不幸的是它会生成同样的错误信息。
      • 也更改为 Requires("CN_PROVIDER").HasValue((float)1) 在原始情况下不起作用.. - 但错误消息已更改为 (103,12) :错误2016:无法对成员“CN_PROVIDER”的值指定条件。 'OracleEFProvider.binary_float' 类型不支持值条件。
      【解决方案3】:

      看起来正确的选择是将 string 用于 HasValue() 方法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多