LLBL Gen 3.x 源代码追踪与解析 认识框架结构
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方法用于添加实体属性与数据库字段的映射关系, 看下图
各个参数的含义,参考图中的智能提示中的内容。
这个映射关系是由ORM设计器来维护的,添加新的字段后,启动设计器重新生成映射关系,便会更新这个文件。
多种数据库支持
LLBL Gen当前支持的数据库如下图所示
括号里面的是当前数据库的提供程序,用于设计器获取数据库元数据。SqlClient在安装SQL Server 2005/2008时会被安装,MySQLDirect是商业的MySQL连接访问程序,可下载免费的Express版本以使ORM设计器正常工作。
当使用Adapter模式时,使用ORM 设计器会生成2个项目结构。
DatabaseGeneric存放实体及其属性,数据关系,验证类型
DatabaseSpecific项目会生成数据库与实体的映射文件,以及数据访问接口DataAccessAdapter
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,它也是同样的名称。
LLBL Gen为我们提供提供的引用方式是,一个ORMSupportClasses,适用于所有数据库,另一个则要依据ORM设计器当前连接的数据库类型,设置不同的驱动。LLBL Gen提供的查询引擎目前包含:
AccessDQE,DB2DQE,FirebirdDQE,MySqlDQE,OracleDQE,PostgreSqlDQE,SqlServerCeDQE,SqlServerDQE,
SybaseAsaDQE,SybaseAseDQE。
Type Converter 类型转换器
请参考文章《LLBL Gen 3.x 源代码追踪与解析 Type Converter 类型转换器》