Какой тип данных используется для хранения длинных строк в Oracle?

#c# #oracle #asp.net-core #entity-framework-core

#c# #Oracle #asp.net-core #entity-framework-core

Вопрос:

Я разрабатываю с использованием .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: запрошено невыполненное или необоснованное преобразование

Комментарии:

1. Версии .Net / .Net Core и EF? Используете ли вы Fluent API для сопоставления? Опубликуйте также этот conf.

2. Добавил @Alessandro. Это верно?

Ответ №1:

В сопоставлении вы можете попробовать использовать .HasColumnType(«CLOB») с вашим ModelBinder

Пример:

 public class ContentDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<<EntityName>>()
            .Property(a => a.<CoulmnName>).HasColumnType("CLOB");
    }
}
  

Комментарии:

1. Я сохранил его в базе данных таким образом, но когда я искал его, возникает ошибка. Исключение NetworkException: исключение завершения сеанса работы с файлом ORA-12537.

Ответ №2:

Согласно ODP.NET Отображение типов данных при миграции EF Core, по умолчанию string используется отображение типов без аннотаций данных / произвольной конфигурации NVARCHAR2(2000) .

В зависимости от значений IsUnicode , IsFixedLength и HasMaxLength , это может быть CHAR[n] , NCHAR[n] VARCHAR2[n] NVARCHAR2[n] , CLOB NCLOB ,,,,,,,,,,,,,,,,,,,.

Поэтому, если вам нужны длинные строки с максимальной длиной > = 2000 символов, вам нужно либо указать максимальную длину >= 2000 с аннотациями данных ( [MaxLength] или [StringLength] , не уверен, какой именно, вам нужно выяснить), либо HasMaxLength fluent API — либо должен предоставить вам тип данных хранилища CLOB или NCLOB . Или укажите тип данных хранилища напрямую через TypeName аргумент [Column] атрибута или HasColumnType fluent API.

Из двух методов предпочтительнее сделать это с помощью указания максимальной длины, поскольку это более абстрактно и не зависит от базы данных и лучше представляет желаемое поведение без работы с конкретными типами баз данных.

Ответ №3:

Помогает ли это вам? Пожалуйста, проверьте это.

https://docs.oracle.com/database/121/REFRN/GUID-D424D23B-0933-425F-BC69-9C0E6724693C.htm#REFRN10321