JSON тип данных
 Can JSONB GIN indexes be specified in CodeFirst EntityFramework with NPGSQL?
https://stackoverflow.com/questions/54618858/can-jsonb-gin-indexes-be-specified-in-codefirst-entityframework-with-npgsql
Тип столбца и свойства

JSON Mapping
https://www.npgsql.org/efcore/mapping/json.html?tabs=data-annotations%2Cpoco

System. Text. Json
Позволяет использовать JsonDocument и JsonElement.

Отчистка JsonDocument1) Вызываем Dispose в setter для предыдущего значения.
2) Делаем сущность Disposable и строим отчистку через Dispose DbContext.
Проблема форматирования

Проблема указания параметров форматирования, с которыми будет выполняться чтение и запись json столбца.

Serialization options for System.Text.Json support
https://github.com/npgsql/efcore.pg/issues/1107

 
XO.EntityFrameworkCore.NpgsqlJsonSerializerOptions
https://www.nuget.org/packages/XO.EntityFrameworkCore.NpgsqlJsonSerializerOptions/
 
Простое решение - реализовать кастомный ValueConverter<JsonElement, string>, определив в нем JsonSerializerOptions 
6.0.0

Parameterspublic static class QueryParameterExtensions
{
   public static NpgsqlParameter StructToDbParameter<T>(
       this T value,
       string name,
        NpgsqlDbType type
        )
       where T : struct
    {
       return new NpgsqlParameter<T>(name, type) { TypedValue = value };
    }

   public static NpgsqlParameter StructToDbParameter<T>(
       this T? value,
       string name,
        NpgsqlDbType type
        )
       where T : struct
    {
       if (!value.HasValue)
        {
           return new NpgsqlParameter(name, type) { Value = DBNull.Value };
        }

       return new NpgsqlParameter<T>(name, type) { TypedValue = value.Value };
    }

   public static NpgsqlParameter ClassToDbParameter<T>(
       this T value,
       string name,
        NpgsqlDbType type
        )
       where T : class
    {
       if (value == null)
        {
           return new NpgsqlParameter(name, type) { Value = DBNull.Value };
        }

       return new NpgsqlParameter<T>(name, type) { TypedValue = value };
    }
}
  

 

Теги: