奕玖科技 > 新闻中心 > 技术文章

Asp.Net制作带有字符串转泛型的EfCode数据库模型

来源: 奕玖科技 瘦死的猪 | 2022/12/21 17:56:51

我在刚学习Asp.Net Core mvc的时候,当时使用的是EfCode来操作数据库。第一次使用ORM刚觉还挺爽的。在制作数据库模型的时候,因为会把一些数据制作成数组或则是JSON格式的数据保存在数据库,那么如果通过EF的数据模型还原的话按照数据库的格式那只能是使用string的数据类型。

数据模型属性 public string Images { get; set; } = "[\"1.jpg\",\"2.jpg\"]";

{images:"[\"1.jpg\",\"2.jpg\"]"} //前端收到的代码

像这样的字符串如果显示到前端也是一个字符串,前端还要进行转换,有没有直接一种办法我们可以直接把Images返回的数据改变成泛型IEnumerable<string>然后直接输出,最后前端得到的数据为

{images:["1.jpg","2.jpg"]}

因为当时是初学者,在网上也找了一下资料。最后总结出了3种方法实现我想要的效果。

1:额外增加一个属性,通过读取原始数据然后用System.Text.Json把数据转换成自己想要的格式

不好意思,上图示例里的Json注释的数据格式有错误,应该是[{ Id:3,Title:"测试" }],就没问题了啊!通过额外的RepJson来返回一个泛型数据给前端。

2:通过dynamic数据类型,然后自己手写get/set。这样就可以避免EfCode对数据库的类型检测不会报错。然后实现数据输入代码如下

namespace ConsoleApp2.Models
{
    public class MyModels
    {
        private List<Obj> _json; 
        public int Id { get; set; }
        public dynamic Jspn //假设数据格式为字符串{ Id:3,Title:"测试" }
        {
            get
            {

                return _json;
            }
            set
            {
                _json = JsonSerializer.Deserialize<List<Obj>>(value, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); ;
            }
        }
    }
    public class Obj { 
    
        public int Id { get; set; } 
        public string Title { get; set; }
    }

}

3:我最推荐的方法,上述2种方法都有各种不优雅的地方。通过Asp.net Core直接对Efcode进行配置。因为初学C#文档没看仔细,后来发现可以通过ModelBuilder对数据读取前后做一个转换,效果跟方法2其实原理是一样的。只是该方法最优雅。

步骤如下,如果使用Efcode我们一般有一个继承DbContext的类,通过OnModelCreating方法注入的ModelBuilder,然后用ModelBuilder对需要转化数据的数据模型进行单独的设置,代码如下

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyModels>(b =>
       {
        b.Property(b => b.Images).HasConversion(v => My.Stringify(v) ?? "[]", v => My.GetJson<string>(v));
      //My.Stringify和 My.GetJson是我自己封装的System.Text.Json方法
      //My.Stringify转换为字符串My.GetJson转换成泛型
    });

}

然后改动数据模型MyModels代码如下

namespace ConsoleApp2.Models
{
    public class MyModels
    {
        public int Id { get; set; }
        public IEnumerable<Obj> Jspn {get; set; } //假设数据格式为字符串[{ Id:3,Title:"测试" }]
    }
    public class Obj { 
    
        public int Id { get; set; } 
        public string Title { get; set; }
    }

}

这样是不是就很优雅了?

栏目导航
相关文章
文章标签
关于我们
公司简介
企业文化
资质荣誉
服务项目
高端网站定制
微信小程序开发
SEO排名推广
新闻动态
行业新闻
技术学院
常见问题
联系我们
联系我们
人才招聘
联系方式
Q Q:24722
微信:24722
电话:13207941926
地址:江西省抚州市赣东大道融旺国际3栋
Copyright©2008-2022 抚州市奕玖科技有限公司 备案号:赣ICP备2022010182号-1