zoukankan      html  css  js  c++  java
  • EFCore.MySql当模型遇到int[]怎么办

    我使用的是Pomole.EntityFrameworkCore.MySql

    需要将旧项目中的excels表转成实体,其中有一列是json格式的int[]

    当遇到第一张表的时候,我使用了这样的方法来读取

     public string InternalData { get; set; }
     private int[] _data;
     public double[] Data
     {
        get
        {
            if(_data == null)
            {
                _data = Array.ConvertAll(InternalData.Trim(new []{'[',']'}).Split(','), Double.Parse);   
            }
            return  _data;         
        }//主要是读取,并不涉及修改
     }    

    但是当我遇到第二张表也是这个结构的时候,我觉得多写这样一段代码,多一个属性的命名很讨厌,而且有误用的可能性。所以我只能另求他法。

    于是我这样写:

    class Primitive
    {
        public int PrimitiveId { get; set; }
        public int Data { get; set; }
    
        [Required]
        public Reference ReferenceClass { get; set; }
    }
    
    class Reference
    {
        public virtual List<Primitive> Data { get; set; }
    }

    也就是用外键关联另一张表,就是感觉只是一个int数组就加了张表关联,有点杀鸡牛刀的感觉,而且读取的时候还要include一下。

    可是当我打开第三张表,发现里面有多个int[]类型的字段的时候!我放弃了。。。

    其实,EFCore2.1预览版有了一种方法来convert,大概像这样:

        modelBuilder
            .Entity<MyEntity>()
            .Property(e => e.Data)
            .HasConversion(
                v => JsonConvert.SerializeObject(v),
                v => JsonConvert.DeserializeObject<int[]>(v));

    不过我用的并不是SQLServer,所以只能求助于Pomelo.EntityFrameworkCore.MySql,得到了这样的方法:

    class Reference
    {
        public JsonObject<int[]> Data1 { get; set; }
    public JsonObject<int[]> Data2 { get; set; }
    }

    哈哈哈,so easy。

    不过这个json类型只支持mysql5.7+版本。

  • 相关阅读:
    Partition4:增加分区
    Partition5:Partiton Scheme是否指定Next Used?
    UniqueIdentifier 数据类型 和 GUID 生成函数
    SQL Server 并发控制 第三篇:隔离级别和行版本(2)
    SQL Server 常用内置函数
    In-Memory:在内存中创建临时表和表变量
    Partition2:对现有表分区
    Partition1:新建分区表
    Partition3:分区切换(Switch)
    Pivot 和 Unpivot
  • 原文地址:https://www.cnblogs.com/pasoraku/p/8599810.html
Copyright © 2011-2022 走看看