2013-11-27 27 views
5

我正在考虑使用EF访问安装在客户系统上的传统SQL Server数据库。实体框架是否支持模型中的不同数据类型?

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

就我所见,从应用程序的角度来看,类型是“兼容的”:例如,一个包含小数字的字段可能是客户A的数据库上的smallint,但是客户B的数据库上的int或包含价格的字段可能是A的数据库上的decimal(10,2),而B的数据库上是float(是的,这意味着B可能遭受损失从浮点问题 - 毕竟这是一个遗留数据库)。

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

+0

您是否尝试过测试:在具有这些差异的几个测试数据库中指向相同的模型?记住这些数据可能会有所作为(例如,小数部分的小数值可能会起作用,而小数部分的小数部分则会失效)。 – Richard

+1

@理查德:还没有,如果没有人能提供权威的答案,那就是我计划要做的事。如果我测试它并且它可以正常工作,我仍然不知道它是否“应该这样工作”,或者它“由于EF的一些实现细节而巧合工作”。 – Heinzi

+0

确实,“看起来有效”的结果不是确定的(但你也不会在这里得到)。然而,“它不起作用”的结果将是。因此,您可以提出真正的问题:在这种情况下如何适应/使用EF(因为不管“官方”职位是什么,所有可能的映射都会自动支持,因此您需要该问题)。 – Richard

回答

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,然后修改每个数据库的创建和更新sql以转换数据类型。

OR

看小巧玲珑的,你必须在SQL更大的控制权,并做转换那里。这个答案有链接到存储库模式的混合实现 EF + Dapper Hybrid Implementation

0

是实体框架能够处理那些(即,将它优雅地接受SQL Server表的双重如果模型定义声称它是一个小数(10,2)),还是会崩溃可怕

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

相关问题