gpt4 book ai didi

c# - 如何使用 EF5 包含从一种数据库类型到另一种实体类型的转换?

转载 作者:行者123 更新时间:2023-12-03 19:44:40 24 4
gpt4 key购买 nike

用例如下:我有一个相同的 SQLite 数据库和一个 SQL Server 数据库。该产品的一些用户将使用 SQLite 版本,一些 SQL Server 版本。但是,默认情况下,SQLite 的主键,不管你的 CREATE TABLE语句,将在内部存储为 64 位整数,我们的 SQL Server 的默认值是 32 位,有时是 16 位整数。

因为我们谈论的是大量记录,所以如果我们将两种类型的数据库中的数据类型都匹配为 64 位,则存储表和索引所需的空间会发生巨大变化。

如果可能的话,我想对实体类型使用带有 Entity Framework 的单个映射。这适用于大多数字段,但不适用于主键字段。即使映射映射到 int , SQLite 中的字段是 INT ,一旦我尝试加载数据,我将收到:

InvalidOperationException: The type of the key field 'CustomerId' is expected to be System.Int32 but the value provided is actually of type 'System.Int64'



我了解异常的原因:SQLite 驱动程序返回 Int64 .我没有在表中的其他字段中收到此错误(即, INT 的其他 DDL 声明映射到 Int32 并且不抛出此错误)。

我想知道 Entity Framework 中是否有扩展点或其他解决方案,在某个地方我可以简单地说:“只需将其转换为 Int32 ,这样做是安全的”。

当前的想法包括创建不同的库和动态映射,或者一些创造性的泛型,但我们所拥有的想法似乎都不能令​​人满意。有什么想法吗?

回答 Matthew 的问题,表格定义如下:

-- 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);

最佳答案

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

我正在使用 EF6 在 sql server 和 sqlite 中处理相同的实体。使用 sqlite 查询时出现上述错误
cntx.Set<T>().FirstOrDefault(a => a.ActivityDescription == activityDescription); .

我的 key 创建为 [VSDebugBreakModeEnterEventArgsId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT在我的 sqlite 数据库中。

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

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

关于c# - 如何使用 EF5 包含从一种数据库类型到另一种实体类型的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23463660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com