簡體   English   中英

使用Dapper.Contrib將枚舉作為字符串插入

[英]Insert enum as string using Dapper.Contrib

我剛剛開始使用Dapper.Contrib來幫助我進行插入和獲取,但是由於我的枚舉作為字符串存儲在數據庫中(出於多種原因),我在插入時遇到了麻煩。 Dapper在讀取時可與字符串枚舉無縫協作,但插入操作始終會將序數值放入數據庫中。

為此,我已經閱讀了許多關於Dapper的建議,並且打開了很多問題,但是找不到有效的解決方案。 我的簡化類如下所示:

public class Person {
  public long Id { get; set; }
  public string Name { get; set; }
  public Gender Gender { get; set; }
}

public enum Gender { Female, Male, TransWoman, TransMan }

我期望我可以配置Dapper.Contrib來使用枚舉名稱而不是序數值來發出插入,以便使下面的代碼神奇地起作用,並在varchar(20)數據庫字段Gender中插入“ Male”:

void InsertPersonFelipe(SqlConnection conn) {
  var person = new Person { Name = "Felipe", Gender = Gender.Male };
  conn.Insert(person);
}

有沒有一種方法可以為typeof(Gender)添加自定義映射?

或者,更好的是,Dapper.Contrib是否提供了配置以使其使用枚舉名稱而不是其序數值?

我編寫了一個擴展方法來處理將枚舉轉換為字符串,並考慮了Dapper.Contrib中的TableComputed屬性。 如果您不想引用Dapper.Contrib,則可以輕松地將它們取出。

用法:

  using (var sql = new SqlConnection(_connString))
  {
      sql.Open();
      sql.InsertB(person);
  }

擴展方式:

    public static long InsertB<T>(this SqlConnection sqlConnection, T obj)
    {
        Dictionary<string, object> propertyValuesMap = new Dictionary<string, object>();

        var columns = new StringBuilder();
        var values = new StringBuilder();
        var tableName = ((TableAttribute)obj.GetType().GetCustomAttribute(typeof(TableAttribute))).Name;
        var relevantProperties = obj.GetType().GetProperties().Where(x => !Attribute.IsDefined(x, typeof(ComputedAttribute))).ToList();

        for (int i = 0; i < relevantProperties.Count(); i++)
        {
            object val = null;
            var propertyInfo = relevantProperties[i];
            if (propertyInfo.PropertyType.IsEnum)
            {
                val = Enum.GetName(propertyInfo.PropertyType, propertyInfo.GetValue(obj));
            }
            else
            {
                val = propertyInfo.GetValue(obj);
            }

            propertyValuesMap.Add(propertyInfo.Name, val);
            var propName = i == relevantProperties.Count() - 1 ? $"{propertyInfo.Name}" : $"{propertyInfo.Name},";
            columns.Append(propName);
            values.Append($"@{propName}");
        }

        return sqlConnection.Execute($"Insert Into {tableName} ({columns}) values ({values})", propertyValuesMap);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM