Oracle Beta EF Provider - почему он не позволяет сопоставить десятичное число с полем «число» - PullRequest
3 голосов
/ 14 июня 2011

Итак ... Я скачал и установил бета-версию Oracle своего провайдера EF ... Почему? Потому что ничто другое, похоже, не работает очень хорошо (я попробовал один на CodePlex, а также на MSDN), и моя компания не собирается платить за коммерчески доступный (такой как от devart).

Итак, это сработало отлично. Я смог увидеть базу данных оракула, выбрать интересующую меня схему, получить определения таблиц. Отлично!

Теперь я получаю ошибку. Похоже, что поведение провайдера по умолчанию состоит в том, чтобы сопоставить числовые (1,0) поля с логическими типами в .NET. Не хорошо, но я должен быть в состоянии изменить это, верно? Ошибка, которую я получил, была чем-то вроде «типы не совпадают». Поэтому я изменяю определение этого поля на десятичное (1,0).

Теперь новая ошибка, которую я получаю, заключается в том, что десятичное число (1,0) несовместимо с числом (1,0). И я застрял. Я не могу внести изменения в сопоставление с чем-либо, что работает.

Я не люблю использовать Oracle для начала, потому что они, похоже, отстаивают пару лет поддержки всего, что связано с .NET. Теперь я готов полностью отказаться от них.

Итак, мой вопрос заключается в следующем ... я это в любом случае помимо компонентов devart, которые я могу заставить Oracle работать с EF? Это сделало бы мою жизнь проще, если бы я мог. Если нет, то я могу вручную написать все это добро ... или сказать партнеру переключиться на SQL-сервер, поскольку он так же хорош (для того, что они с ним делают ...)

Ответы [ 3 ]

1 голос
/ 27 июня 2011

Звучит как бета 1. По умолчанию бета 1 отображает число (1,0) в логическое значение, а все другие типы чисел - в десятичное.

Бета-версия 2 вышла и должна решить обе эти проблемы. Бета-версия 2 позволяет вам выбирать, на что отображать Number (1,0), а также поддерживает отображение на более разумные вещи, такие как int и long, когда вы используете число (X, 0). Полная информация находится в файле readme , но короткая версия заключается в том, что самый быстрый способ получить то, что вам нужно, это установить бета-версию 2, а затем удалить и воссоздать вашу модель. (Вы можете обновить его, но это немного хлопотно из-за бета-версии 1 из-за того, что многое изменилось, и, похоже, вы далеко не ушли.)

По моему опыту с бета 2, он должен правильно определять типы гораздо чаще, чем бета 1. Таким образом, вы не должны были так сильно меняться.

1 голос
/ 22 июня 2011

Попробуйте открыть модель в редакторе XML, измените тип свойства на число с точностью до 2 в части модели SSDL и измените тип свойства на Десятичное с точностью до 2 в части модели CSDL .

0 голосов
/ 27 июня 2011

Несколько дней назад в своем последнем проекте я работал над Oracle 11g и ODAC beta для EF4.Я сталкивался с множеством проблем, связанных с его использованием: ни одна функция не может получить к ней доступ, работа с Stored Prodedure великолепна и проста до тех пор, пока вы не вернете какое-либо значение из нее, тогда вам придется использовать RefCusrose, в представлении вы должны указать первичный ключ ичто вы указываете отображение числовых полей (1,0) на логическое значение, и большинство полей отображаются в десятичном формате.

Я обнаружил, что форум Oracle очень полезен здесь, в форме оракула люди дали три предложения, чтобы решить его, я как он все это цитирует ..

1,В файлах .Config устанавливаются переменные

В ODAC EF Beta 2 по умолчанию номер (1, 0) будет сопоставлен с Edm.Int16.Вы можете указать в app.config или web.config для сопоставления Number (1, 0) с Edm.Boolean.

Следующая информация относится к будущей бета-версии 2:

Отображение по умолчанию для типов Oracle NUMBER (p, 0) может быть переопределено на основе настраиваемого сопоставления, которое можно настроить в app.config, web.config или machine.config.

Например, , по умолчанию NUMBER (1, 0) сопоставляется с Int16.Однако пользователи могут захотеть сопоставить NUMBER (1, 0) с типом .NET Bool или .NET Byte.Это можно сделать с помощью файла конфигурации.

Ниже приведен пример app.config, который содержит настраиваемое сопоставление, в котором NUMBER (1, 0) сопоставляется с Bool, NUMBER (3,0) сопоставляется с байтоми максимальные значения точности для Int16, Int32, Int64 изменяются на 4, 9, 18 по сравнению со значениями по умолчанию 5, 10, 19 соответственно:

 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
 <connectionStrings>
 </connectionStrings>
 <oracle.dataaccess.client>
 <settings>
 <add name="bool" value="edmmapping number(1,0)" />
 <add name="byte" value="edmmapping number(3,0)" />
 <add name="int16" value="edmmapping number(4,0)" />
 <add name="int32" value="edmmapping number(9,0)" />
 <add name="int64" value="edmmapping number(18,0)" />
 </settings>
 </oracle.dataaccess.client>
 </configuration>

2.Статический класс Для конвертации:

 namespace convert{
static class boolConvert
 {

  public static bool boolchar(char ON)
  {
    switch (ON)
    {
      case 'O':
      return true;
      case 'N':
      return false;
      default:
      return true;
    }
  }

  public static char charbool(bool ON)
  {
   switch (ON)
   {
    case true:
    return 'O';
    case false:
    return 'N';
    default:
    return 'O';
   }
  }

}
}

, тогда вы можете использовать его для конвертации, где это необходимо: bool isSomthing = convert.boolConvert.boolchar ('N');char isSomthigEelse = convert.boolConvert.charbool (true);

3.Использование свойства Если вы используете POCO

Если вы используете один из генераторов кода, который генерирует POCO, вы можете добавить свойство в частичный класс.Если у вас есть поле с именем «MyField», то в частичный класс добавьте что-то вроде этого:

 public bool MyField_Boolean
 {
 get
 {
  return MyField == 'O';
 }
 }

Вы не сможете использовать MyField_Boolean внутри запроса EF Linq (поскольку это не свойство базы данных) но где-нибудь еще в вашем коде вы можете использовать его, чтобы получить булеву версию.

Хотя я еще не тестировал ни одну из них, но, возможно, это решит вашу проблему.Я надеюсь, что в следующей версии ODAC таких проблем не будет.

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