Использование Entity Framework с псевдо-логическими значениями Oracle - PullRequest
4 голосов
/ 07 мая 2010

Я расследую использование Entity Framework в моей организации.Мы используем СУБД Oracle, и поэтому (хорошо это или плохо) используем шаблон «псевдо-логический», распространенный в Oracle, где вместо логического столбца (который не существует в Oracle) у вас есть 1-символьный столбец с проверкойограничение, чтобы заставить его "Y" или "N".

Итак, если я хочу, чтобы сущность в моей модели EF имела логическое свойство, как мне сопоставить это со столбцом базы данных как "Y" дляправда и "N" для ложного?Есть ли в Entity Framework понятие «Конвертеры» или что-то такое, что сделает это для меня?

И только потому, что он, вероятно, появится, я знаю, что EF работает только с SQL Server из коробки.Я бы использовал DevArt dotConnect для Oracle, чтобы использовать EF с Oracle.
http://www.devart.com/dotconnect/oracle/

Edit
Как насчет других сред ORM, таких как NHibernate?Они обрабатывают этот сценарий "из коробки"?

Ответы [ 2 ]

3 голосов
/ 07 мая 2010

Devart dotConnect для Oracle имеет автоматическое сопоставление столбца NUMBER (1) с System.Boolean, это упрощает работу с этими столбцами - 0 соответствует false, ненулевое (1 по умолчанию) - true. Никаких дополнительных действий не требуется.
Если вы хотите сохранить логические значения в форме char, выберите один из следующих подходов:
1. Оставьте строковый тип для свойства, сопоставленного с символьным столбцом. Добавьте дополнительное свойство-оболочку логического типа в класс частичного объекта и преобразуйте строковое значение в логическое и наоборот в методах получения и установки соответственно.
Недостаток : Это свойство оболочки нельзя использовать в LINQ to Entities.
2. Создайте представление над своей таблицей, которое будет возвращать 0 или 1 вместо значений из столбца вашего персонажа. В качестве альтернативы создайте DefiningQuery в модели для этого EntitySet (в этом случае его не следует добавлять в базу данных). В большинстве случаев потребуется изменить тип свойства с «char (1)» на «bool» в SSDL и с System.String на System.Boolean в CSDL. Вы должны написать набор хранимых процедур для выполнения операций CUD с вашей сущностью и отобразить эти процедуры, чтобы эта сущность была обновляемой.
Недостаток : много работы.

1 голос
/ 18 мая 2010

В настоящее время нет официального сопоставления EDM-EF от Oracle - у DevArt и DataDirect есть пользовательские уровни поставщиков соединений Oracle, которые вы можете купить. Есть также квази-открытые версии, доступные на CodeProject, которые реализуют EDM для EF с Oracle. Я предполагаю, что вы используете один из них.

Чтобы ответить на ваш вопрос, вам нужно изменить реализацию ProviderManifest, чтобы она возвращала соответствующий тип .NET при вызове GetEdmType(). Проблема в том, что этот метод передает вам тип Oracle и ожидает, что вы вернете тип .NET, который понимает EF (он понимает все примитивы, включая bool). К сожалению, нежелательно отображать CHAR(1) в логическое значение, поскольку в принципе у вас могут быть другие столбцы CHAR(1), которые не bools.

Обходной путь для решения этой проблемы - создать пользовательский тип oracle (JKBOOL, скажем, :), который сопоставлен с CHAR(1) - вам придется изменить таблицы для изменения CHAR(1) до JKBOOL. Теперь вы можете безопасно связать JKBOOL с System.Boolean в GetEdmType().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...