我在刚学习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; } } }
这样是不是就很优雅了?