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
中的HasColumnType
为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
。 理想情况下,我希望按照每个班级来做到这一点。
任何人都可以将我指向正确的方向吗?
虽然可以在SQL Server中隐式地将bigint
转换为int
,但似乎Entity框架的EDM类型(这实际上是您正在处理的)不允许从64位整数类型到32的隐式转换位整数类型。
这可能有很好的理由,因为你可以很容易地溢出并且具有不适合int
字段的值。
也就是说,你应该有两个基类,一个用于int
ID,另一个用于long
ID。 这不太好,但是它强制你确实想要的逻辑; 你将无法存储大于数据库中int
值的值,那么为什么你希望能够在代码级别上完成呢? 实体框架在这里做正确的事情不会让你应用这种转换。