EF Core 3.1 code-first with Oracle -将字符串设置为NVARCHAR 2(2000)而不是NCLOB

ql3eal8s  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(154)

我有一个应用程序,它必须同时支持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)之间实现此字符串的完全兼容性?
谢谢你的帮助!

i2byvkas

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):

modelBuilder.Property(x => x.MyProperty)
   .IsUnicode(true)
   .IsFixedLength(true)
   .HasMaxLength(65536); // some integer > 2000

字符串
下面是ODP.NETFCore文档中的另一个(非常简短的)页面,使用数据注解获得类似的结果。

相关问题