C#:更改实体框架的检索数据类型

Posted

技术标签:

【中文标题】C#:更改实体框架的检索数据类型【英文标题】:C#: Change Retrieval DataType for Entity Framework 【发布时间】:2012-03-25 10:22:56 【问题描述】:

我正在尝试将当前使用自定义 DAO 框架的项目转换为使用实体框架。该系统非常大,因此对数据库(如果重要的话是 SQL Azure DB)本身的更改并不是特别可行,应尽可能避免。

问题在于 ID 列。不幸的是,在创建系统时,有些表的数据类型为 bigint,而有些表的数据类型为 int - 但模型本身都来自 ID 为 long 的基类。以前的框架能够处理这种情况,但我一直无法找到使用实体框架的方法。

下面是我能想到的最简单的例子:

public class Context : DbContext 
    public IDbSet<Foo> Foos get;set;
    public IDbSet<Bar> Bars get;set;

public abstract class BaseClass 
    public long ID;

public class Foo : BaseClass 
    ...

public class Bar : BaseClass 
    ...

SQL Table: Foo
+-------------+
| id : bigint |
| ...         |
+-------------+
SQL Table : Bar
+-------------+
| id : int    |
| ...         |
+-------------+

当我尝试加载 Bar 模型时,我收到此错误:

The 'ID' property on 'BaseClass' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Int64'.

我想找到一种方法告诉系统 Bar 有整数,而 Foo 有长整数。我尝试在上下文中覆盖OnModelCreating 并为Bar 定义HasColumnType。这给了我一个新的错误:

Schema specified is not valid. Errors:
    (105,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.Int64[Nullable=False,DefaultValue=]' of member 'ID' in type 'Bar' is not compatible with 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' of member 'ID' in type 'CodeFirstDatabaseSchema.Bar'.

在我看来,如果在将请求发送到服务器之前,我只能将 BaseClassID 的预期数据类型更改为 int,那么我应该能够向上转换为 @收到回复后987654334@。理想情况下,我希望在每个班级的基础上执行此操作。

谁能指出我正确的方向?

【问题讨论】:

【参考方案1】:

虽然您可以隐式转换 bigint to an int in SQL Server,但似乎实体框架 EDM 类型(这正是您正在处理的)不允许从 64 位整数类型隐式转换为 32-位整数类型。

这可能是有充分理由的,因为您可能很容易溢出并拥有不适合 int 字段的值。

也就是说,您应该有两个基类,一个用于int ID,一个用于long ID。它不漂亮,但它强制执行您绝对想要的逻辑;您将无法存储大于数据库中int 的值的值,那么您为什么希望能够在代码级别执行此操作? Entity 框架在这里做了正确的事情,不让您应用该转换。

【讨论】:

是的 - 这就是我害怕的。我认识到我正试图用另一个错误来解决一个错误。我只是希望我能够通过一些小技巧来避免重大的彻底改变。我尝试过的一切都没有奏效,所以我想我已经辞职,完全按照你的建议去做。如果没有更好的解决方案,我会将此标记为正确的。 @Merwer 有时候,真相很伤人,请不要拍信使=) 嗨@casperOne 很抱歉插入我的问题,因为它是同一个主题。有没有相反的方法。我有一个 id 类型为 Int 的表。它变得危险地大,我想知道是否有办法将其更改为 Long? (实体框架 CF 6.1) @hjavaher 您应该找到对主键int 的所有外键引用,并将它们更改为bigint(当然还有主键)。做起来应该不会太难。

以上是关于C#:更改实体框架的检索数据类型的主要内容,如果未能解决你的问题,请参考以下文章

实体框架更改 Id 类型

使用实体框架/休眠与 sql2008 地理数据类型

C# LLSQL快速查询框架

C# 实体框架 - 优化/最佳实践

无法使用实体框架保存数据库更改

让实体框架忽略派生类型