Почему и "реальный", и "плавающий" отображаются на "Single" вместо "Double"?

Я использую System.Data.SQLite 1.0.90 с VS2013 и EntityFramework 5 в режиме Model-First (= EDMX).

Я создал новую базу данных SQLite, содержащую таблицу:

CREATE TABLE [..]
  [Test1integer] integer,
  [Test2int] int,
  [Test3smallint] smallint,
  [Test4tinyint] tinyint,
  [Test5bigint] bigint,
  [Test6money] money,
  [Test7float] float,
  [Test8real] real,
  [Test9decimal] decimal,
  [Test10numeric18_5] numeric(18,5), [..]

Соответствующими частями являются Test7float и Test8real.

После выполнения Обновить модель из базы данных... EDMX теперь содержит следующее:

SSDL:

      <Property Name="Test1integer" Type="integer" />
      <Property Name="Test2int" Type="int" />
      <Property Name="Test3smallint" Type="smallint" />
      <Property Name="Test4tinyint" Type="tinyint" />
      <Property Name="Test5bigint" Type="integer" />
      <Property Name="Test6money" Type="decimal" Precision="53" Scale="0" />
      <Property Name="Test7float" Type="real" />
      <Property Name="Test8real" Type="real" />
      <Property Name="Test9decimal" Type="decimal" Precision="53" Scale="0" />
      <Property Name="Test10numeric18_5" Type="decimal" Precision="18" Scale="5" />

Соответствующими частями являются Test7float и Test8real.

CSDL:

      <Property Name="Test1integer" Type="Int64" />
      <Property Name="Test2int" Type="Int32" />
      <Property Name="Test3smallint" Type="Int16" />
      <Property Name="Test4tinyint" Type="Byte" />
      <Property Name="Test5bigint" Type="Int64" />
      <Property Name="Test6money" Type="Decimal" Precision="53" Scale="0" />
      <Property Name="Test7float" Type="Single" />
      <Property Name="Test8real" Type="Single" />
      <Property Name="Test9decimal" Type="Decimal" Precision="53" Scale="0" />
      <Property Name="Test10numeric18_5" Type="Decimal" Precision="18" Scale="5" />

Соответствующими частями являются Test7float и Test8real.

Проблема

Test7float ошибочно стал "настоящим" + "Одиночным" - и дизайнер также не позволяет здесь "Двойной".

В документах SQLite3 (http://www.sqlite.org/datatype3.html) четко указано, что "real" - это 8-байтовое число с плавающей запятой IEEE, а "float" - только синоним "real" - поэтому в каждом случае "Double" (8 байт) должен быть предпочтительнее "Single" (4 байт).

Я что-то делаю неправильно или что-то неправильно понял? Если нет: где дела идут не так и как я могу их исправить?

Должен ли я создать отчет об ошибке для этого?

Ответ 1

Похож на ошибку в драйвере сопоставления.

Тип, используемый для объявления столбца, используется только для сродства (вы можете объявить столбец как float и хранить в нем blobs, если хотите).

При представлении структуры таблиц SQLite просто возвращает определение SQL, которое было использовано для создания его полей (и, если применимо, их изменить).

Таким образом, ваш драйвер имеет доступ только к "float" для типа поля и, вероятно, сопоставляет его "одиночному" с помощью какого-то общего кода, который, возможно, не был написан с учетом SQLite (или переопределен для SQLite в любом случае).