#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