在Oracle中,用于存储长字符串的数据类型是什么?

5

我正在使用.NET Core进行开发。

数据库使用Oracle。Varchar2的最大值为4000字节,那么用什么数据类型存储超过此长度的数据?

我使用CLOB创建了一个列,并将其映射到.NET。

模型

public string CONTENTS { get; set; }

代码

try
{
    var content= _mapper.Map<T_CONTENT>(post);

    _dbcontext.T_CONTENT.Add(content);
    _dbcontext.SaveChanges();
    transaction.Commit();

    return content.ID;
}
catch (Exception e)
{
    transaction.Rollback();
    return null;
}

public class contentDbContext : DbContext
{
    public contentDbContext(DbContextOptions options)    : base(options) { }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }

    public DbSet<T_CONTENT> T_CONTENT{ get; set; }
}

当我保存数据时,我收到下面的错误。 错误信息:ORA-01460:请求的转换未实现或不合理。

.Net/.Net Core和EF的版本是什么?您是否使用Fluent API进行映射?请同时发布该配置。 - Alessandro R
@Alessandro 已添加。正确吗? - 김세림
3个回答

4
在映射中,您可以尝试使用“.HasColumnType(“ CLOB”)”与您的modelBinder。
例如:
public class ContentDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<<EntityName>>()
            .Property(a => a.<CoulmnName>).HasColumnType("CLOB");
    }
}

我是这样将它保存到数据库的,但当我搜索时,出现了一个错误。 NetworkException: ORA-12537网络会话文件结束异常。 - 김세림
这对我来说完美地起作用了,谢谢。请注意,在<CoulmnName>中有一个小的拼写错误。 - Wayne Birch

1
根据ODP.NET EF Core 迁移数据类型映射,默认的string类型映射没有数据注释/流畅配置是NVARCHAR2(2000)
根据IsUnicodeIsFixedLengthHasMaxLength的值,它可以是CHAR[n]NCHAR[n]VARCHAR2[n]NVARCHAR2[n]CLOBNCLOB
如果您需要MaxLength>=2000个字符的长字符串,则需要使用数据注释([MaxLength][StringLength],不确定哪一个,您需要确定)或HasMaxLength流畅API指定最大长度>=2000 - 任何一个都应该给您CLOBNCLOB存储数据类型。或者,通过[Column]属性的TypeName参数或HasColumnType流畅API直接指定存储数据类型。

从这两种方法中,首选的是通过指定最大长度来实现,因为它更抽象和与数据库无关,并且更好地表示所需的行为而不涉及特定于数据库的类型。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接