5

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

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

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

由于我们不是唯一访问数据库的人,因此更改(并因此统一)模式不是一种选择。Entity Framework 是否能够处理这个问题(即,double如果模型定义声称它是 a ,它会优雅地接受 SQL Server 表中的 a decimal(10,2))还是会严重崩溃?

4

2 回答 2

3

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

短到布尔

'Y'/'N' 到 true/false

从数据库中的字符串转换为布尔属性Entity Framework 4.1

时间(0)到日期时间

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

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

日期时间 2 到日期时间

你的smallinttoint将属于这一类,但我很确定float不会decimal(10, 2)

您的问题因拥有多个具有不同数据类型的数据库而变得更加复杂,因此我认为 EF 本身不会很好地工作。

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

在每个数据库中创建一致地映射数据类型的视图,然后从视图反向工程实体框架。您可能还必须将 CUD 映射到存储过程,然后修改每个数据库的 Create 和 Update sql 以转换数据类型。

或者

查看 Dapper,您可以更好地控制 sql 并在那里进行转换。在这个答案EF + Dapper Hybrid Implementation上有存储库模式的混合实现的链接

于 2013-11-27T12:06:51.700 回答
0

实体框架是否能够处理这个问题(即,如果模型定义声称它是小数(10,2),它会优雅地接受 SQL Server 表中的双精度数)还是会严重崩溃

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

于 2013-11-27T11:37:21.900 回答