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

Hei*_*nzi 5 c# sql-server entity-framework legacy-database

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

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

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

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

Col*_*lin 4

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

布尔短路

'Y'/'N' 为 true/false

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

时间(0) 到日期时间

几乎所有的解决方案都是在实体中包含 2 个字段,并使用代码来执行显式转换。

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

datetime2 到 DateTime

smallintint属于这一类,但我很确定float不会decimal(10, 2)

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

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

在每个数据库中创建一致映射数据类型的视图,然后从视图对实体框架进行逆向工程。您可能还需要将 CUD 映射到存储过程,然后修改每个数据库的创建和更新 sql 以转换数据类型。

或者

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