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

C#:更改实体框架的检索数据类型,c#,entity-framework,data-binding,azure-sql-database,sqldatatypes,C#,Entity Framework,Data Binding,Azure Sql Database,Sqldatatypes,我正在尝试将当前使用自定义DAO框架的项目转换为使用实体框架的项目。该系统相当大,因此对数据库(一个SQLAzure数据库,如果需要的话)本身的更改不是特别可行,如果可能的话应该避免 问题在于ID列。不幸的是,在创建系统时,有些表的数据类型为bigint,有些表的数据类型为int,但模型本身都来自一个基类,ID为long。以前的框架能够处理这种情况,但我一直无法找到一种使用实体框架的方法 下面是我能想到的最简单的例子: public class Context : DbContext {

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

问题在于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有int,而Foo有long。我已经尝试在上下文中重写
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'.
在我看来,如果我只能在将请求发送到服务器之前将
BaseClass
ID
的预期数据类型更改为
int
,那么我应该能够在收到响应后向上转换为
long
。理想的情况下,我想在每班的基础上做这件事


有人能给我指出正确的方向吗?

虽然可以隐式强制转换,但实体框架EDM类型(实际上就是您要处理的)似乎不允许从64位整数类型隐式转换为32位整数类型

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


也就是说,您应该有两个基类,一个用于
int
ID,另一个用于
long
ID;您将无法在数据库中存储大于
int
的值,那么您为什么希望能够在代码级别上进行存储呢?实体框架在这里做的是正确的,不允许您应用这种转换。

是的,这就是我害怕的。我意识到我正试图用另一个错误来修复一个错误。我只是希望我能通过一些小技巧避免重大的彻底改变。我尝试过的每一件事都以失败告终,所以我想我已经完全听从了你的建议。如果没有更好的解决方案,我会把这个标记为正确的。@Merwer有时,真相会伤害你,请不要向信使开枪=)嗨@casperOne抱歉打断我的问题,因为这是同一个主题。有没有相反的方法呢。我有一个id为Int类型的表。它正在危险地变大,我想知道是否有办法将它改为Long?(实体框架CF 6.1)@hjavaher您应该找到主键的所有外键引用,即
int
,并将其更改为
bigint
(当然也包括主键)。这应该不难做到。
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'.