2015-06-30 2 views
0

В настоящее время у меня возникают некоторые проблемы при попытке использовать код EF6 для сопоставления существующей базы данных Oracle и создания таблицы для иерархии. Сценарий таблицы я хочу карту выглядит следующим образом:EF6 TPH с 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 Database Информация имеет 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- Можно ли реализовать TPH в Oracle с использованием Номер столбца как дискриминатор? 2- Я что-то упускаю?

Сейчас я пойду вперед (и реализую иерархию с использованием фабрики на моем уровне репозитория), но я готов попробовать любое предлагаемое решение - спасибо заранее!

ответ

3

I также столкнулись с той же проблемой, используя столбец Numeric в качестве дискриминатора. Решение, которое я использовал, должно также работать на вас. В соответствии с этим используйте следующий код:

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

Объявите свои столбцы 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, 
); 
+0

Спасибо за ответ - к сожалению, он не работал ... Я создал новую таблицу с использованием новой структуры и скопировал значения между обеими таблицами (просто чтобы убедиться), но, к сожалению, она генерирует одно и то же сообщение об ошибке , – rshimoda

+0

Также меняется на Требуется («CN_PROVIDER»). HasValue ((float) 1) В оригинальном случае не работает .. - но сообщение об ошибке изменилось на (103,12): ошибка 2016: Условие не может быть задано по значениям члена CN_PROVIDER. Условия значения не поддерживаются для типа 'OracleEFProvider.binary_float'. – rshimoda

1

Похоже, правильный вариант заключается в использовании строку для метода HasValue()

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