PetaPoco的默认映射

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值。

        /// <summary>
        /// Constructs a TableInfo for a POCO by reading its attribute data
        /// </summary>
        /// <param name="pocoType">The POCO Type</param>
        /// <returns></returns>
        public TableInfo GetTableInfo(Type pocoType)
        {
            return TableInfo.FromPoco(pocoType);
        }

        /// <summary>
        /// Constructs a ColumnInfo for a POCO property by reading its attribute data
        /// </summary>
        /// <param name="pocoProperty"></param>
        /// <returns></returns>
        public ColumnInfo GetColumnInfo(PropertyInfo pocoProperty)
        {
            return ColumnInfo.FromProperty(pocoProperty);
        }

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

TableInfo.FromPoco

        /// <summary>
        /// Creates and populates a TableInfo from the attributes of a POCO
        /// </summary>
        /// <param name="t">The POCO type</param>
        /// <returns>A TableInfo instance</returns>
        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

        /// <summary>
        /// Creates and populates a ColumnInfo from the attributes of a POCO property.
        /// </summary>
        /// <param name="pi">The property whose column info is required</param>
        /// <returns>A ColumnInfo instance</returns>
        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://youring2.cnblogs.com/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载:http://www.cnblogs.com/youring2/archive/2012/06/20/2556440.html 

时间: 2024-10-14 22:44:26

PetaPoco的默认映射的相关文章

《Spring Data 官方文档》5.8. 使用自定义转换器重载默认映射至5.10. 异常解释

5.8. 使用自定义转换器重载默认映射 为了对映射过程有更细粒度的控制,你可以使用'CassandraConverter'实现来注册Spring转换器,例如'MappingCassandraConverter'. "MappingCassandraConverter"检查是否有任何Spring转换器可以在这些特殊类试图映射自身对象之前处理. 为了'hijack' MappingCassandraConverter'的正常映射策略,或许为了提高性能或其他自定义映射需求,您首先需要创建一个

EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

原文:EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF里的默认映射.具体分为: 数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名: 表映射:Code First 默认会按照类型名复数建立数据

Elasticsearch之_default_—— 为索引添加默认映射

前篇说过,ES可以自动为文档设定索引.但是问题也来了--如果默认设置的索引不是我们想要的,该怎么办呢? 要知道ES这种搜索引擎都是以Index为实际的分区,Index里面包含了不同的类型,不同的类型是逻辑上的分区:每种类型可能包含有相同的字段,如果字段的类型相同还好,如果不同....那就会导致字段的冲突了. 本篇就讲述如何使用REST API以及Logstash设置默认的索引. 更多内容参考:Elasticsearch知识汇总 使用Rest API设置默认的索引 首先先看一下不设置默认索引时,我

使用Logstash创建ES映射模版并进行数据默认的动态映射规则

本文配置为 ELK 即(Elasticsearch.Logstash.Kibana)5.5.1. Elasticsearch 能够自动检测字段的类型并进行映射,例如引号内的字段映射为 String,不带引号的映射为数字,日期格式的映射为日期等等,这个机制方便了我们快速上手 ELK,但是后期我们经常需要对一些特定的字段进行定制,之前本人有一篇文章进行这方面的尝试Logstash中如何处理到ElasticSearch的数据映射,但对于默认映射规则没有介绍,本文就来探讨一些默认的动态映射规则. 开始之

Hibernate 动态表名映射(数据库分表) NamingStrategy

NamingStrategy接口很有意思,可以作为业务类规范和数据库表规范的桥梁,例如一个数据对象User,对应数据库表是 T_USER,如果所有映射关系都是这样的情况,可以使用NamingStrategy做为一个桥梁衔接,当然你也可以在hbx.xml配置文件中指定 class对应的table.   hibernate.cfg.xml代码就省略了...   User.hbx.xml代码 <hibernate-mapping>     <class name="User"

EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子

原文:EF里的继承映射关系TPH.TPT和TPC的讲解以及一些具体的例子 本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discriminator列用来区分基类和子类的数据.新建一个度假村Resort实体类试试: /// <summary> /// 度假村类 /// </summary> public class Resort : Lodg

《Spring Data 官方文档》7. 映射

7. 映射 "CassandraMappingConverter"提供了丰富的映射支持. "CassandraMappingConverter"具有丰富的元数据模型,提供了将域对象映射到CQL表的一套完整的特性功能集合. 使用域对象上的注解来填充映射元数据模型. 然而,基础架构不会强求使用注解作为元数据信息的唯一来源."CassandraMappingConverter"还允许您通过遵循一组公约来将对象映射到文档,而不用提供任何其他元数据. 本章

Logstash中如何处理到ElasticSearch的数据映射

Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台.这中间,最关键的就是要对数据的类型就行定义或映射. 本文讨论的 ELK 版本为 5.5.1. 为什么要定义数据 Elastisearch不仅是一个强大的全文检索引擎,它还能够对一些数据类型进行实时的统计运算,相关的结果可以通过Kibana的图表展现出来.如果数据类型没有正确的定义,那么Elasticsearch就无法进行运算了,因此,虽然数据类型的定义需要花一点时间,但你会收到意

EntityFramework Core映射关系详解

前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关系) 首先我们从最简单的一对多关系说起,我们给出需要映射的两个类,一个是Blog,另外一个则是Post,如下: public class Blog { public int Id { get; set; } public int Count { get; set; } public string N