zoukankan      html  css  js  c++  java
  • LLBL Gen 3.x 源代码追踪与解析 认识框架结构

    Info PR: n/a I: 2,230,000 L: error LD: 608,013 I: n/a Rank: 618 Age: 一月 14, 2004 I: 0 whoissourceRobo: yesSitemap: yes Rank: 814097 Price: 26 Density

    LLBL Gen作为一款商业的ORM工具,有强大的ORM设计器,稳定的查询语法。
    先来看一下,ORM的基础要素
    1  对象和数据库表格的映射
    2  查询的实现,对于添加,删除,修改命名,如何映射成数据库的SQL命令
    3  多种数据库支持的实现

    对象和数据库表格的映射

    NHibernate采用的是xml文件存储实体属性与数据库字段的映射关系,之后,大量的ORM框架模范这一做法。xml文件的好处是编辑方便,不需要编译;LLBL Gen采用的是C#代码来存储实体属性与数据库字段的映射关系。
    在生成的DBSpecific项目中,PersistenceInfoProvider.cs就是存储这种映射关系的文件。

    internal static class PersistenceInfoProviderSingleton用于提供单件模式。以SalesOrderHeaderEntity为例子,来找到它的数据库字段的映射关系。

    internal class PersistenceInfoProviderCore : PersistenceInfoProviderBase
        {
            internal PersistenceInfoProviderCore()
            {
                Init();
            }

            private void Init()
            {
                this.InitClass((70 + 0));
                InitSalesOrderHeaderEntityMappings();

             }

    private void InitSalesOrderHeaderEntityMappings()
            {
                this.AddElementMapping( "SalesOrderHeaderEntity", "AdventureWorks", @"Sales", "SalesOrderHeader", 27 );
                this.AddElementFieldMapping( "SalesOrderHeaderEntity", "AccountNumber", "AccountNumber", true, "NVarChar", 15, 0, 0, false, "", null, typeof(System.String), 0 );
               }
    先看AddElementMapping方法
    会添加实体SalesOrderHeaderEntity与数据库AdventureWorks的SalesOrderHeader表的映射,也就是映射到AdventureWorks.Sales.SalesOrderHeader,它有27个数据库字段。
    AddElementFieldMapping方法用于添加实体属性与数据库字段的映射关系, 看下图

    image

    各个参数的含义,参考图中的智能提示中的内容。

    这个映射关系是由ORM设计器来维护的,添加新的字段后,启动设计器重新生成映射关系,便会更新这个文件。

    多种数据库支持

    LLBL Gen当前支持的数据库如下图所示

    image 

    括号里面的是当前数据库的提供程序,用于设计器获取数据库元数据。SqlClient在安装SQL Server 2005/2008时会被安装,MySQLDirect是商业的MySQL连接访问程序,可下载免费的Express版本以使ORM设计器正常工作。
    当使用Adapter模式时,使用ORM 设计器会生成2个项目结构。

    DatabaseGeneric存放实体及其属性,数据关系,验证类型

    image

    DatabaseSpecific项目会生成数据库与实体的映射文件,以及数据访问接口DataAccessAdapter

    image 
    读取采购单的代码片段

    DataAccessAdapter adapter = new DataAccessAdapter();
    SalesOrderHeaderEntity salesOrder = new SalesOrderHeaderEntity(43659);
    adapter.FetchEntity(salesOrder);

    DataAccessAdapter派生于DataAccessAdapterBase,在设计器生成这个文件时,会加入当前的数据库驱动

    protected override DynamicQueryEngineBase CreateDynamicQueryEngine()
            {
                return this.PostProcessNewDynamicQueryEngine(new DynamicQueryEngine());
            }
    在ORM设计时对象映射时,连接到的时SQL Server数据库,引用的是SQL Server的驱动程序,于是会在生成的

    DataAccessAdapter中加入SQL Server的DynamicQueryEngine,即使换成MySQL,它也是同样的名称。

    image

    LLBL Gen为我们提供提供的引用方式是,一个ORMSupportClasses,适用于所有数据库,另一个则要依据ORM设计器当前连接的数据库类型,设置不同的驱动。LLBL Gen提供的查询引擎目前包含:
    AccessDQE,DB2DQE,FirebirdDQE,MySqlDQE,OracleDQE,PostgreSqlDQE,SqlServerCeDQE,SqlServerDQE,
    SybaseAsaDQE,SybaseAseDQE。

    Type Converter 类型转换器

    请参考文章《LLBL Gen 3.x 源代码追踪与解析 Type Converter 类型转换器》

  • 相关阅读:
    Linux学习 :字符设备框架
    Linux学习 :Uboot, Kernel, 根文件系统初步分析
    Linux学习 : 裸板调试 之 配置UART
    Linux学习 : 裸板调试 之 配置使用NAND FLASH
    Linux学习 : 裸板调试 之 使用MMU
    Linux I2C总线控制器驱动(S3C2440)
    Linux I2C总线设备驱动模型分析(ov7740)
    Linux摄像头驱动学习之:(六)UVC-基本框架代码分析
    【Java】 剑指offer(25) 合并两个排序的链表
    【Java】 剑指offer(24) 反转链表
  • 原文地址:https://www.cnblogs.com/shihao/p/2164428.html
Copyright © 2011-2022 走看看