【问题标题】:How can I include a conversion from one database type to another entity type with EF5?如何使用 EF5 包含从一种数据库类型到另一种实体类型的转换?
【发布时间】: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,从INTEGERINT,一一进行,试图找出是否是一种特定情况导致了这种行为。

标签: c# .net sql-server entity-framework sqlite


【解决方案1】:

这是一个老问题,但我遇到了类似的问题,这就是我所做的。

我正在使用 EF6 在 sql server 和 sqlite 中处理相同的实体。使用 sqlite 查询时出现上述错误

cntx.Set<T>().FirstOrDefault(a => a.ActivityDescription == activityDescription);

我的密钥是在我的 sqlite 数据库中创建的,类似于 [VSDebugBreakModeEnterEventArgsId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT

我能够将模型上的密钥更改为 Int64 而不是 int 并解决了问题。我不必更改我的 sql server db 架构中的任何内容来适应这一点。可以使用由 sqlite 或 sql server 数据库支持的 ef 上下文插入、更新、删除和查询实体。

此外,此行为仅在我将 ef nugets 从 ??? 升级到 EF 6.1.1 后发生。曾经有 3 个不同的项目使用 3 个不同版本的 ef,我决定将它们全部升级到相同版本。那是上述异常开始发生的时候。

【讨论】:

  • 感谢您抽出宝贵时间回答这个老问题。我最近碰巧在另一个项目中遇到了同样的问题,但我们通过暂时禁止 sqlite 解决了这个问题。所以我很高兴知道现在有一种解决方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多