PostgreSQL EF Core의 Json 처리

EnityFrameworkCore의 7.0 미리보기가 나왔기 때문에 PostgreSQL EF Core에서 Json의 처리를 검증했습니다.
컨디션
  • Microsoft.EntityFrameworkCore 7.0.0-preview.1.22076.6
  • Npgsql 7.0.0-preview.1
  • Npgsql.EntityFrameworkCore.PostgreSQL 7.0.0-preview.1
  • .NET 6
  • Npgsql.Json.NET 7.0.0-preview.필요 없을 것 같아요.
    전제 조건
    PostgresSQL의 Entry Framework Core에서 JSON 사용
  • A) String mapping
  • B) POCO mapping
  • C) JsonDocument DOM mapping
  • 의 3가지
    A의 문자열로 처리된 것은 JSON에 대한 직렬화와 역직렬화입니다.다른 두 가지와 비교하면 이것은 제한된 방법이다.
    장점과 단점
    다음은 실제 A와 B를 실시함으로써 얻은 지식이다.
    A의 방법

  • 스스로 직렬화, 역직렬화가 필요하다.EF에서는 Load Context 시 역직렬화하고 Save 이전에 직렬화하면 됩니다.(기타 처리로 정시, get 속성시, set에서도 가능)
  • 이렇게 계속context.SaveChanges가 작동합니다.
  • double.NaN, double.PositiveInfinity, double.NegativeInfinitySystem.Text.Json(Microsoft)를 제이슨으로 처리할 수 있다.
    그러나 브러쉬 등System.Text.Json도 처리할 수 없는 유형이 있어 문자열 등으로 처리해야 한다.
  • B의 방법
  • 자신은 Json의 직렬화와 역직렬화를 필요로 하지 않는다.
  • 그러나 속성의 값을 변경해도 context.SaveChanges는 작용하지 않는다.약간의 처리가 필요하다.
  • 예1 Json의 속성을 변경한 것을 나타내는 IsModified를 진짜로 한다.context.Entry(groupB).Property(e => e.CustomerJsonb).IsModified = true;
  • 사용 ValueComparer 기능 예 2 Change Tracker
  • dobule.NaN 등은 이렇게 처리할 수 없다(현재 단계에서).문자열로 처리하면 됩니다.
  • Json으로 처리할 수 없는 유형
    A와 B 모두 Json 처리 유형으로 사용할 수 없으며 문자열로 저장할 수 있습니다.
    예: Brush
    더블의 무한대, 비수를 Json용 문자열의 예로 삼다
  • B를 사용하는 방법.A의 방법으로 System.Text.Json(Microsoft)를 이용하면 무한대, 비수를 Json으로 만들 수 있기 때문에 필요 없다.
  • 테스트만 하면 이걸로 할 수 있을 것 같아요.
  • 응용 내부에서 사용Number.사용NumberSJson.
  •     private double _number;
        [JsonIgnore]
        public double Number
        {
            get { return _number; }
            set
            {
                _number = value;
                _numberS = value.ToString();
            }
        }
    
        private string? _numberS;
        public string? NumberS
        {
            get { return _numberS; }
            set
            {
                _numberS = value;
                _number = double.Parse(value);
            }
        }
    
    Json용 문자열의 예로 Brush 사용
  • 애플리케이션 내부에서 Color 속성을 사용합니다.Json은 Colors를 이용한다.
  • SolidColorBrush만 대상입니다.
  •     private Brush? _color;
        [JsonIgnore]
        public Brush? Color
        {
            get { return _color; }
            set
            {
                _color = value;
                _colorS = value?.ToString(); // → value is null ? null : value.ToString();
            }
        }
    
        private string? _colorS;
        public string? ColorS
        {
            get { return _colorS; }
            set
            {
                _colorS = value;
                _color = Utils.GetBrushFromString(value);
            }
        }
    
    데이터 기반 Json에 B로 저장된 예

    PostgreSQL의jsonbjson는 조금 다르다.다만,'\u221E'는'∞'라는 점은 다르게 표현한 것일 뿐이다.
    B 메서드의 Enity 전체
    public class GroupB
    {
        public int Id { get; set; }
        [Column(TypeName = "jsonb")]
        public CustomerB? CustomerJsonb { get; set; }  //Jsonbで保存
        [Column(TypeName = "json")]
        public CustomerB? CustomerJson { get; set; }  //Jsonで保存
    }
    public class CustomerB
    {
        public string? Name { get; set; }
    
        private double _number;
        [JsonIgnore]
        public double Number
        {
            get { return _number; }
            set
            {
                _number = value;
                _numberS = value.ToString();
            }
        }
    
        private string? _numberS;
        public string? NumberS
        {
            get { return _numberS; }
            set
            {
                _numberS = value;
                _number = double.Parse(value);
            }
        }
    
        private Brush? _color;
        [JsonIgnore]
        public Brush? Color
        {
            get { return _color; }
            set
            {
                _color = value;
                _colorS = value?.ToString(); // → value is null ? null : value.ToString();
            }
        }
    
        private string? _colorS;
        public string? ColorS
        {
            get { return _colorS; }
            set
            {
                _colorS = value;
                _color = Utils.GetBrushFromString(value);
            }
        }
    }
    
    public static class Utils
    {
        public static SolidColorBrush? GetBrushFromString(string? brushString)
        {
            return string.IsNullOrEmpty(brushString) ? null : (SolidColorBrush?)new BrushConverter().ConvertFromString(brushString);
        }
    }
    
    시험을 준비하다
  • 지금까지 설정을 저장하기 위해 XML을 사용했지만 제이슨은 사용하기 쉽다.
  • 더블, 브러쉬의 제이슨 직렬화, 역직렬화에 대해 재고하고 정리했다.나는 지금까지 처리된 번잡함을 개선했다.
  • 이렇게 기사에 정리되지 않으면 자신도 잊어버린다.
  • 참고 자료
  • Entity framework not detecting jsonb properties changes in c#
  • How to store JSON in an entity field with EF Core?
  • PostgreSQL의 json/jsonb형 처리
  • EF7의 JSON 지원 정보
  • How to serialize a Windows.Media.Brush
  • 좋은 웹페이지 즐겨찾기