博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PetaPoco的默认映射
阅读量:6154 次
发布时间:2019-06-21

本文共 3610 字,大约阅读时间需要 12 分钟。

PetaPoco的映射需要继承IMapper接口,该接口提供了四个方法:

  • TableInfo GetTableInfo(Type pocoType);
  • ColumnInfo GetColumnInfo(PropertyInfo pocoProperty);
  • Func<object, object> GetFromDbConverter(PropertyInfo TargetProperty, Type SourceType);
  • Func<object, object> GetToDbConverter(PropertyInfo SourceProperty);

Brad提供了一个StandardMapper类来实现这个接口,完成PetaPoco中的默认映射。

这个类实现了两个方法:GetTableInfo 和GetColumnInfo,后两个转换的方法均返回null值。

///         /// Constructs a TableInfo for a POCO by reading its attribute data        ///         /// The POCO Type        /// 
public TableInfo GetTableInfo(Type pocoType) { return TableInfo.FromPoco(pocoType); } /// /// Constructs a ColumnInfo for a POCO property by reading its attribute data /// /// ///
public ColumnInfo GetColumnInfo(PropertyInfo pocoProperty) { return ColumnInfo.FromProperty(pocoProperty); }

通过调用TableInfo的FromPoco静态方法生成一个新的TableInfo类,和通过调用ColumnInfo的FromProperty静态方法生成一个新的ColumnInfo类。接下来我们看看这两个方法:

TableInfo.FromPoco

///         /// Creates and populates a TableInfo from the attributes of a POCO        ///         /// The POCO type        /// 
A TableInfo instance
public static TableInfo FromPoco(Type t) { TableInfo ti = new TableInfo(); // Get the table name var a = t.GetCustomAttributes(typeof(TableNameAttribute), true); ti.TableName = a.Length == 0 ? t.Name : (a[0] as TableNameAttribute).Value; // Get the primary key a = t.GetCustomAttributes(typeof(PrimaryKeyAttribute), true); ti.PrimaryKey = a.Length == 0 ? "ID" : (a[0] as PrimaryKeyAttribute).Value; ti.SequenceName = a.Length == 0 ? null : (a[0] as PrimaryKeyAttribute).sequenceName; ti.AutoIncrement = a.Length == 0 ? false : (a[0] as PrimaryKeyAttribute).autoIncrement; return ti; }

这个方法通过反射,得到TableInfo的TableName、PrimaryKey、AutoIncrement等信息。

ColumnInfo.FromProperty

///         /// Creates and populates a ColumnInfo from the attributes of a POCO property.        ///         /// The property whose column info is required        /// 
A ColumnInfo instance
public static ColumnInfo FromProperty(PropertyInfo pi) { // Check if declaring poco has [Explicit] attribute bool ExplicitColumns = pi.DeclaringType.GetCustomAttributes(typeof(ExplicitColumnsAttribute), true).Length > 0; // Check for [Column]/[Ignore] Attributes var ColAttrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); if (ExplicitColumns) { if (ColAttrs.Length == 0) return null; } else { if (pi.GetCustomAttributes(typeof(IgnoreAttribute), true).Length != 0) return null; } ColumnInfo ci = new ColumnInfo(); // Read attribute if (ColAttrs.Length > 0) { var colattr = (ColumnAttribute)ColAttrs[0]; ci.ColumnName = colattr.Name==null ? pi.Name : colattr.Name; ci.ForceToUtc = colattr.ForceToUtc; if ((colattr as ResultColumnAttribute) != null) ci.ResultColumn = true; } else { ci.ColumnName = pi.Name; ci.ForceToUtc = false; ci.ResultColumn = false; } return ci; }

该方法通过反射得到一个属性所对应的字段的信息。

通过这两个方法能够得到实体到数据表的映射关系,在类PocoData和PocoColumn中,将实际的数据通过映射得到具体的实体。

转载地址:http://tcbfa.baihongyu.com/

你可能感兴趣的文章
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
转:Vue keep-alive实践总结
查看>>
深入python的set和dict
查看>>
C++ 11 lambda
查看>>
Android JSON数据解析
查看>>
DEV实现日期时间效果
查看>>
java注解【转】
查看>>
centos 下安装g++
查看>>
嵌入式,代码调试----GDB扫盲
查看>>
下一步工作分配
查看>>
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>