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

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

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

下面是我能想到的最微不足道的例子:

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中的HasColumnTypeBar定义了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 ,那么在收到响应之后,我应该能够将其上变频很long 。 理想情况下,我希望按照每个班级来做到这一点。

任何人都可以将我指向正确的方向吗?


虽然可以在SQL Server中隐式地将bigint转换为int ,但似乎Entity框架的EDM类型(这实际上是您正在处理的)不允许从64位整数类型到32的隐式转换位整数类型。

这可能有很好的理由,因为你可以很容易地溢出并且具有不适合int字段的值。

也就是说,你应该有两个基类,一个用于int ID,另一个用于long ID。 这不太好,但是它强制你确实想要的逻辑; 你将无法存储大于数据库中int值的值,那么为什么你希望能够在代码级别上完成呢? 实体框架在这里做正确的事情不会让你应用这种转换。

链接地址: http://www.djcxy.com/p/58107.html

上一篇: C#: Change Retrieval DataType for Entity Framework

下一篇: inline elements ignoring line