首先使用Oracle的EF Core 3.1代码-字符串设置为NVARCHAR2(2000),而不是NCLOB



我有一个应用程序,它必须同时支持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文档使用数据注释获得类似的结果。

相关内容

最新更新