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上下文和定义HasColumnType的Bar.这给了我一个新的错误:
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)
在我看来,如果我只能改变预期的数据类型为ID中BaseClass到int发送请求到服务器之前,那么我就应该能上转换成long我收到响应后.理想情况下,我想在每个班级的基础上这样做.
谁能指出我正确的方向?
虽然你可以隐式转换一个bigint到intSQL Server中,似乎实体框架EDM类型(这是真的你处理什么)不允许从64位整数类型隐式转换为32位整数类型.
这可能是有充分理由的,因为您可能很容易溢出并且具有不适合int字段的值.
也就是说,你应该有两个基类,一个用于intID,一个用于longID.它不漂亮,但它强制执行你绝对想要的逻辑; 您将无法存储大于int数据库中可以容纳的值的值,那么为什么您希望能够在代码级别上执行此操作?实体框架在这里做了正确的事情,不允许您应用该转换.
| 归档时间: |
|
| 查看次数: |
5049 次 |
| 最近记录: |