我有一个应用程序,它必须同时支持SQL Server DB和Oracle DB。
我配置了一个基本属性:
public string MyProperty{ get; set; }
字符串
当我的数据库在SQL Server中生成时,列的类型是nvarchar(MAX)
(太棒了!),但在Oracle 11 g中,它是一个NVARCHAR2(2000)
,如果存储在Oracle中,它会限制字符串的大小。
奇怪的是,这篇Oracle文章提到NCLOB
应该是字符串的默认类型。
这是否意味着它取决于所使用的Oracle版本?还是EF Core的版本?还是我错过了什么
如何在SQL Server(nvarchar(max)
)和Oracle(NCLOB
)之间实现此字符串的完全兼容性?
谢谢你的帮助!
1条答案
按热度按时间i2byvkas1#
指向Oracle文档的链接是针对ADO.NET/ Entity Framework的(与EF Core相对)。这就解释了你期望的行为和你观察到的行为之间的区别。
你最好参考一下ODP.NET EF Core的文档。从这里的Table 5-1开始,在中间位置,如果没有其他配置,string属性类型默认为
NVARCHAR2(2000)
。我强烈建议您阅读下表以及其他有关Oracle EF Core如何处理不同类型的字符串列的相关细节,特别是这一段(强调我的):NCHAR和NVARCHAR 2使用字符长度语义。具有这些数据类型之一的列的字符数取决于字符集NLS_NCHAR_CHARACTERSET。ODP.NET Entity Framework Core默认为2字节字符集,NCHAR和NVARCHAR 2列最多允许2000个字符。如果字符串实体属性使用[Maxlength(4000)]数据注解或fluent API等效项,则ODP.NET将该属性Map到NCLOB类型,因为指定的长度大于2000个字符。
如果你想要NCLOB,一种实现的方法是添加下面的Fluent API(摘自表5-1):
字符串
下面是ODP.NETFCore文档中的另一个(非常简短的)页面,使用数据注解获得类似的结果。