Dapper.NET映射与数据注释

时间:2013-05-01 13:46:37

标签: data-annotations dapper

所以我有一个类有这样一个属性的类:

public class Foo
{
  [Column("GBBRSH")
  public static string Gibberish { get; set;}
  ....
}

为了保存数据,我对其进行了配置,以便更新/插入语句使用自定义函数:

public static string GetTableColumnName(PropertyInfo property)
{
  var type = typeof(ColumnAttribute);
  var prop = property.GetCustomAttributes(type, false);

  if (propr.Count() > 0)
    return ((ColumnAttribute)prop.First()).Name;
  return property.Name;
}

这处理得很好,但是我注意到当我去检索数据时,它实际上并没有通过该特定列的函数提取数据。我注意到其他数据被拉了,但是有问题的列是唯一没有检索数据的字段。

1)是否有办法将GetTableColumnName函数用于Dapper的检索部分?

2)如果出现这种情况,是否有办法强制Dapper.NET抛出异常?我真的不希望有一种虚假的安全感,一切都按预期工作,但实际上并非如此(我得到的是我使用Dapper.NET默认不使用的映射,但我确实想要以这种方式设置它。)

编辑:

我正在查看Dapper的SqlMapper源代码并找到:

 private static IEnumerable<T> QueryInternal<T>(params) // my knowledge of generics is limited, but how does this work without a where T : object?
 {
   ...
   while (reader.Read())
   {
     yield return (T)func(reader);
   }
   ...
 }

所以在找到这个之后我学到了两件事。阅读Func并阅读yield(之前从未使用过)。我的猜测是我需要将reader.Read()传递给另一个函数(检查列标题并适当地插入对象)并返回那个?

1 个答案:

答案 0 :(得分:2)

您可以更改select语句以使用"SELECT [Column("GBBRSH")] AS Gibberish"之类的别名,并提供属性名称和poco属性名称之间的映射。

这样,Dapper将填充匹配的属性,因为它只需要您的POCO匹配列的确切名称。