【发布时间】:2014-05-05 01:47:36
【问题描述】:
用例如下:我有一个相同的 SQLite 数据库和一个 SQL Server 数据库。该产品的一些用户将使用 SQLite 版本,一些 SQL Server 版本。但是,默认情况下,无论您的CREATE TABLE 语句如何,SQLite 的主键都会在内部存储为 64 位整数,而我们的 SQL Server 的默认值是 32 位,有时是 16 位整数。
因为我们讨论的是大量记录,如果我们将两种类型的数据库中的数据类型都匹配为 64 位,则存储表和索引所需的空间会发生巨大变化。
如果可能的话,我想对实体类型使用与实体框架的单一映射。这适用于大多数字段,但不适用于主键字段。即使映射映射到int,并且SQLite 中的字段是INT,只要我尝试加载数据,我就会收到:
InvalidOperationException:键字段“CustomerId”的类型应为 System.Int32,但提供的值实际上是“System.Int64”类型
我了解异常的原因:SQLite 驱动程序返回一个Int64。我没有在表中的其他字段中收到此错误(即,INT 的其他 DDL 声明映射到 Int32 并且不要抛出此错误)。
我想知道实体框架中是否有扩展点,或者其他解决方案,在某个地方我可以简单地说:“只需将其转换为 Int32,这样做是安全的”。
当前的想法包括创建不同的库和动态映射,或者一些创造性的泛型,但我们的想法似乎都不能令人满意。有什么想法吗?
回答马修的问题,表格定义如下:
-- works
CREATE TABLE [Customer] (
[CustomerId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT FAIL,
[Name] CHAR NOT NULL ON CONFLICT FAIL);
-- works not (throws above error, unless I manually change
-- type in EDMX to from int to integer and Int32 to Int64)
CREATE TABLE [Customer] (
[CustomerId] INT NOT NULL PRIMARY KEY ON CONFLICT FAIL,
[Name] CHAR NOT NULL ON CONFLICT FAIL);
【问题讨论】:
-
SQLite表是如何定义的?
-
@Matthew:我更新了问题以包含一个示例。奇怪的是,我刚刚发现错误并不总是抛出。我现在通过 DDL,从
INTEGER到INT,一一进行,试图找出是否是一种特定情况导致了这种行为。
标签: c# .net sql-server entity-framework sqlite