首页 > 解决方案 > 将 MySql 数据库中的 JSON 列映射到 Web Api 中的 C# 类

问题描述

我有一个 MySql 数据库,其列Id intNamejson

地方表样本

Id      Name
1       {"en":"Sphinx","ar":"أبو الهول","fr":"Le sphinx"}

C#地方类

public class Place
{
        [Key, Column("id")]
        public int Id { get; set; }

        [Column("name")]
        public string Name { get; set; }
}

我正在与 EntityFramework 6 连接并连接成功并检索这样的数据

{Id = 1, Name = "{\"en\":\"Sphinx\", \"ar\":\"أبو الهول\", \"fr\":\"Le sphinx\"}" }


我想要如何将名称映射到new ObjectJSON string

像这样的东西

地方类

public class Place
{
        [Key, Column("id")]
        public int Id { get; set; }

        [Column("name")]
        public Localized<string> Name { get; set; }
}

本地化类

public class Localized<T>
{
        public T en { get; set; } // english localization
        public T ar { get; set; } // arabic localization
        public T fr { get; set; } // french localization
}

当我这样做时,这个Name属性是NULL有价值的


存储库中的代码

using (var context = new PlacesEntityModel())
{
     return context.Places.Take(5).ToList();
}

我不想用AutoMapper

我希望 EntityFramework 中的某些内容在数据库级别中仅选择一种语言而不获取所有其他数据然后映射它

如何解决这个问题?

标签: c#mysqlasp.net-mvcentity-frameworkasp.net-web-api

解决方案


您可以尝试扩展方法来映射您的实体类型。

public class Place
{
    [Key, Column("id")]
    public int Id { get; set; }

    [Column("name")]
    public string Name { get; set; }
}

public class PlaceDTO
{
    [Key, Column("id")]
    public int Id { get; set; }

    [Column("name")]
    public Localized<string> Name { get; set; }
}

public class Localized<T>
{
    public T en { get; set; } // english localization
    public T ar { get; set; } // arabic localization
    public T fr { get; set; } // french localization
}

扩展方法ToDto

public static class Extensions
{
    public static PlaceDTO ToDto(this Place place)
    {
        if (place != null)
        {
            return new PlaceDTO
            {
                Id = place.Id,
                Name = JsonConvert.DeserializeObject<Localized<string>>(place.Name)
            };
        }

        return null;
    }
}

用法

var place = new Place() { Id = 1, Name = "{\"en\":\"Sphinx\", \"ar\":\"أبو الهول\", \"fr\":\"Le sphinx\"}" };
var placeDTO = place.ToDto();

Console.WriteLine($"{placeDTO.Id}-{placeDTO.Name.ar}-{placeDTO.Name.en}-{placeDTO.Name.fr}");

推荐阅读