c#当实体类属性和Json字符串字段名与数据库列名不一致时获取映射列名的方法

今天遇到了一个很恶心的事,数据库列名都是带下划线“_”的,使用公司类库的方法取值取出来的字段都是带下划线的json,但是c#属性命名规范这么起名很糟心,于是去网上查找发现c#自带将json列名映射到属性的特性。

方法很简单,只需要将实体模型的属性上方增加一个特性JsonProperty

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
/// 方案实体模型
/// </summary>
public class PlanModel
{
/// <summary>
/// 方案id
/// </summary>
[Column("plan_id")]//这个可以不加 这是EF6那种的解决方案
[JsonProperty("plan_id")]
public string PlanId { get; set; }
/// <summary>
/// 方案名称
/// </summary>
[Column("plan_name")]
[JsonProperty("plan_name")]
public string PlanName { get; set; }

​ }

假如你的json长这样

1
2
3
4
{
"plan_id": "123456",
"plan_name": "示例方案名称"
}

将你的json赋值给变量str 使用起来就是这样:

1
var strModel = JsonConvert.DeserializeObject<PlanModel>(str)

然后问题又来了 我逻辑运行完的数据是赋值给了PlanId和PlanName 我想进行数据库插入怎么办呢?

只要这么写就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// <summary>
/// 获取实体模型属性所对应列名
/// </summary>
/// <typeparam name="T">实体模型</typeparam>
/// <param name="model">实体模型</param>
/// <param name="attributeName">当前属性名</param>
/// <returns></returns>
public static string GetMappingDemo<T>(T model, string attributeName)
{
try
{
var attributeMappingName = model.GetType()?.GetProperty(attributeName)?.CustomAttributes?.FirstOrDefault(c => c.AttributeType.Name == "ColumnAttribute")?.ConstructorArguments?.FirstOrDefault().Value?.ToString();
return string.IsNullOrEmpty(attributeMappingName) ? attributeName : attributeMappingName;
}
catch (Exception)
{

return attributeName;
}

}

调用方法

1
GetMappingDemo(new PlanModel(), "PlanId");

这样就把映射的列名取出来了,然后怎么玩就看你们的了,我们是定义了一种类似于Dictionary的类型,然后直接重命名key就ok了