[英]Is there a way I can avoid getting another copy of a child data when I include a parent in 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.