【问题标题】:Why both "real" and "float" get mapped to "Single" instead of "Double"?为什么“真实”和“浮动”都映射到“单”而不是“双”?
【发布时间】:2014-01-08 17:15:54
【问题描述】:

我在模型优先模式 (=EDMX) 下使用 System.Data.SQLite 1.0.90 和 VS2013 和 EntityFramework 5。

我创建了一个包含表的新 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), [..]

相关部分为Test7floatTest8real

在执行从数据库更新模型...之后,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" />

相关部分为Test7floatTest8real

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" />

相关部分为Test7floatTest8real

问题

Test7float 错误地变成了“真实”+“单”——设计师也不允许在此处使用“双”。

SQLite3 文档 (http://www.sqlite.org/datatype3.html) 明确指出“real”是一个 8 字节的 IEEE 浮点数,而“float”只是“real”的同义词——所以在每种情况下都是“Double”(8 字节) 应优先于“Single”(4 字节)。

我做错了什么还是我误解了什么?如果不是:哪里出了问题,我该如何解决?

我应该为此创建一个错误报告吗?

【问题讨论】:

  • 看起来你发现了一个错误 :) 你应该看看这个问题是否是由你之前的人报告的,并在适当的时候提交一个新的错误报告。
  • @Luaan 您认为它是 EntityFramework 中的常见错误还是仅适用于 System.Data.SQLite?
  • 我不明白为什么这应该与 EntityFramework 本身有关。 EF 确实支持单打和双打,所以它可能是 SQLite“驱动程序”中的一些错误映射。我也会尝试先配置一下,也许有一些兼容性设置之类的。

标签: entity-framework sqlite


【解决方案1】:

看起来像是映射驱动程序中的一个错误。

用于声明列的类型仅用于亲和性(如果需要,您可以将列声明为浮点数并在其中存储 blob)。

报告表结构时,SQLite 仅返回用于创建其字段的 SQL 定义(并在适用时更改它们)。

因此,您的驱动程序只能访问字段类型的“float”,并可能通过一些通用代码将其映射到“single”,这些代码可能没有考虑 SQLite 编写(或者无论如何都被 SQLite 覆盖)。

【讨论】:

  • 自从 EMDX 驱动的模型优先开发被宣布弃用以来,我在一年前切换到代码优先,所以这个问题(以及更多问题)不再影响我了。
【解决方案2】:

真正的sqllite数据类型其实是float(http://www.sqlite.org/datatype3.html),对应的.Net框架类型是Single(http://msdn.microsoft.com/en-us/library/b1e65aza.aspx

【讨论】:

  • sqlite-real/float = 8 bytes = 64 bit = c#-Double -- 我真的不明白为什么你认为它可能是 4 字节(32 位)Single
猜你喜欢
  • 2020-09-28
  • 2017-10-08
  • 2010-12-22
  • 1970-01-01
  • 2016-02-05
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多