Entity Framework是否支持模型中的不同数据类型?

时间:2013-11-27 11:03:21

标签: c# sql-server entity-framework legacy-database

我正在考虑使用EF访问客户系统上安装的旧版SQL Server数据库。

问题是数据库模式不是100%一致的:虽然它们都具有相同(相关)的表和字段,但某些数字字段可能具有不同的数据类型。

据我所知,从应用的角度来看,这些类型是“兼容的”:例如包含小数字的字段可能是客户A的数据库中的smallint,但客户B的数据库上的int或包含价格的字段可能是A的数据库上的decimal(10,2),但是{ B的数据库上的{1}}(是的,这意味着B可能会遇到浮点问题 - 毕竟它是遗留数据库)。

由于我们不是唯一访问数据库的人,因此不能选择更改(并因此统一)模式。实体框架是否能够应对这种情况(即,如果模型定义声称它是float),它会优雅地接受SQL Server表中的double还是会崩溃?

2 个答案:

答案 0 :(得分:3)

如果您查看StackOverflow,您会发现许多问题,询问如何将数据库中的一种数据类型映射到另一种数据类型:

Short to Bool

'Y'/'N' to true/false

Convert from to string in database to boolean property Entity Framework 4.1

time(0) to DateTime

解决方案几乎总是在实体中有2个字段,代码用于显式转换。

可以使用FluentAPI映射少量数据类型,您可以使用自定义代码优先约定:

datetime2 to DateTime

您的smallintint将属于此类别,但我非常确定floatdecimal(10, 2)不会。

由于拥有多个具有不同数据类型的数据库,您的问题更加复杂,因此我认为EF本身并不能很好地运行。

我可以想到你可以尝试的两件事:

在每个映射数据类型的数据库中创建视图,然后从视图中反向设计实体框架。您可能还需要map the CUD to stored procedures然后修改每个数据库的Create and Update sql以转换数据表。

OR

查看Dapper,您可以更好地控制sql并在那里进行转换。在此答案 EF + Dapper Hybrid Implementation

上有链接到存储库模式的混合实现

答案 1 :(得分:0)

  

实体框架是否能够应对这种情况(即,如果模型定义声称它是小数(10,2),它是否会优雅地接受SQL Server表中的双精度)或者它会严重崩溃

我认为这不会导致问题,因为实体框架会在执行查询之前进行所需的所有转换,并且由于没有从浮点到十进制的隐式转换,您应该在编译时检测它并进行显式转换。