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

Mer*_*wer 8 c# data-binding entity-framework sqldatatypes azure-sql-database

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

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

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

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    |
| ...         |
+-------------+
Run Code Online (Sandbox Code Playgroud)

当我尝试加载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'.
Run Code Online (Sandbox Code Playgroud)

我想找到一种方法告诉系统Bar有内注,而Foo有多头.我试着重写OnModelCreating上下文和定义HasColumnTypeBar.这给了我一个新的错误:

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'.
Run Code Online (Sandbox Code Playgroud)

在我看来,如果我只能改变预期的数据类型为IDBaseClassint发送请求到服务器之前,那么我就应该能上转换成long我收到响应后.理想情况下,我想在每个班级的基础上这样做.

谁能指出我正确的方向?

cas*_*One 5

虽然你可以隐式转换一个bigintintSQL Server中,似乎实体框架EDM类型(这是真的你处理什么)不允许从64位整数类型隐式转换为32位整数类型.

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

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