Asp.net core Enum as string + ef core value convertor

更新 : 2019-06-08 前端

build in convertor web

https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions#built-in-converterssql

注意 : value null 是不走 convertor 的哦, 因此咱們也不須要顧慮 nullable 的狀況.typescript

 

更新 2019-06-01 數據庫

string jsonWithConverter = JsonConvert.SerializeObject(new Dada { name = "keatkeat", type = Type.Completed }, new StringEnumConverter());

 

 

寫 c# 咱們喜歡用 enum. 可是 enum to sql, enum to fronend 都是麻煩. json

由於 enum 通常會轉換成 int 而不是 string. 但是這樣就不可讀了. c#

因此呢,咱們的要動點手腳 api

 

ef core convert asp.net

modelBuilder.Entity<Order>().Property(p => p.status).IsRequired().HasMaxLength(128).HasConversion(
    v => v.ToString(),
    v => (OrderStatus)Enum.Parse(typeof(OrderStatus), v)
);

有了這個在數據庫就能夠看見 string 了.ui

 

而後是 web api 

services.AddMvc(options =>
{
    options.EnableEndpointRouting = false;
})
.AddJsonOptions(options =>
{
    options.SerializerSettings.Converters.Add(new StringEnumConverter());
})

這樣 GET 就能夠輸出 string 了,  POST 的時候 binding, asp.net core 會自動轉換, 因此前端傳 string or int 均可以. 

 

OData

很是聰明,啥也不用弄,它原本就輸出 string ... 也有點恐怖啦..

 

typescript 

enum StringStatus { 
    pending = 'pending',
    completed = 'completed'
}
enum NumberStatus { 
    pending,
    completed = 13
}
console.log(StringStatus.pending); // 'pending'
console.log(NumberStatus.pending); // 0
console.log(NumberStatus.completed); // 13
相關文章
相關標籤/搜索