繁体   English   中英

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

[英]How can I include a conversion from one database type to another entity type with EF5?

用例如下:我有一个相同的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 ,这样做是安全的”。

当前的想法涉及创建不同的库和动态映射,或一些创造性的泛型,但是我们似乎没有一个想法可以令人满意。 有什么想法吗?

在回答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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM