我有一个应用程序,它必须同时支持SQL Server数据库和Oracle数据库。
我配置了一个基本属性:
public string MyProperty{ get; set; }
当我的数据库在SQL Server中生成时,列的类型是nvarchar(MAX)
(很棒!(,但在Oracle 11g中,它是NVARCHAR2(2000)
,如果存储在Oracle中,它会限制我的字符串的大小。
奇怪的是,这篇Oracle文章提到NCLOB
应该是字符串的默认类型。。。
这是否意味着它取决于所使用的Oracle版本?还是EF Core的版本?还是我错过了什么?
如何在SQL Server(nvarchar(max)
(和Oracle(NCLOB
(之间实现此字符串的完全兼容性?
谢谢你的帮助!
指向Oracle文档的链接是针对ADO的。NET/实体框架(与EF核心相对(。这就解释了你期望的行为和你观察到的行为之间的区别。
你最好参考ODP的这份文件。NET EF核心。在表5-1的顶部稍过一半,您会发现没有任何其他配置的字符串属性类型将默认为NVARCHAR2(2000)
。我强烈建议阅读该表,了解Oracle EF Core如何处理不同类型的类似字符串的列的其他相关细节,尤其是这一段(重点是我的(:
NCHAR和NVARCHAR2使用字符长度语义。具有其中一种数据类型的列的字符数取决于字符集NLS_NCHAR_CHARACTERSETODP。NET实体框架核心默认为2字节字符集,NCHAR和NVARCHAR2列最多允许2000个字符如果字符串实体属性ODP使用[Maxlength(4000(]数据注释或fluent API等效项。NET将属性映射到NCLOB类型,因为指定的长度大于2000个字符。
如果您想要NCLOB,实现这一目标的一种方法是添加以下Fluent API(取自表5-1(:
modelBuilder.Property(x => x.MyProperty)
.IsUnicode(true)
.IsFixedLength(true)
.HasMaxLength(65536); // some integer > 2000
这是ODP中的另一个(非常简短的(页面。NET EF Core文档使用数据注释获得类似的结果。