轮子来袭 vJine.Core Orm 之 04_使用进阶

1、配置文件:
  1. 框架默认情况下支持"connectionStrings"的配置方式,如《轮子来袭 vJine.Core Orm 之 01_快速入门》所述;
  2. 框架的进阶设定将支持更为详尽、灵活的配置,而您需要做的只是按照给定的格式增加相应的配置节即可(样例及解释如下)。
<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="vJine.Net"><!-- 必须制定:格式及内容固定 -->
      <section name="OrmConfig" type="vJine.Core.AppConfig`1[[vJine.Core.ORM.OrmConfig, vJine.Core]], vJine.Core"/>
    </sectionGroup>
  </configSections>
<connectionStrings> <add name="Default" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=Test;Integrated Security=True"/> </connectionStrings> <vJine.Net> <OrmConfig> <Adapters Active="false"> <!-- 由用户指定扩展的Adapter(继承自vJine.Core.ORM.IDbAdapter), --> <Adapter Active="true" name="My_Orm_Adapter" pattern="O_My"> <type>vJineCore_QuickStart.My_Orm_Adapter, vJineCore_QuickStart</type> </Adapter> </Adapters> <Connections> <!-- 后续内容会覆盖此前db.name相同的内容, connectionStrings中的内会在初始配置时会添加到此段, 字段对应关系如下(name->name,providerName->providerName,connectionString->connectionString) db各属性的意义: .name: new DataManager(string name)中对应的name,默认(new DataManager())为Default, .providerName:DbProviderFactories用以创建DbProviderFactory; .connectionString:DbProviderFactory用以连接数据库的连接字符串 .adapter:Adapter配置节对应的name .host,.port,.user,.password;作为connectionString的配置项目可单独设置、修改,并在新建DataManager实例时替换相应索引值, 即:connectionString = string.format(connectionString,.host,.port,.user,.password);如果不需要,可不必指定。 .adapter:如果指定则按da.adapter查找对应的adapter.name;否则按db.providerName,db.name的顺序匹配adapter.pattern --> <db name="O_My_Test" providerName="System.Data.SQLite" adapter="SQLite" host="{0}" port="{1}"> <connectionString>Data Source=default_data.db;Version=3;Pooling=True;Max Pool Size=100;</connectionString> <user>{2}</user> <password>{3}</password> </db> <db name="SQLite" providerName="System.Data.SQLite" adapter="SQLite"> <connectionString>Data Source=default_data.db;Version=3;Pooling=True;Max Pool Size=100;</connectionString> </db> <db name="MySQL" providerName="MySql.Data.MySqlClient" host="127.0.0.1" port="3306"> <user>root</user> <password>******</password> <connectionString>server={0};charset=utf8;User Id={2};Password={3};database=test;Persist Security Info=True</connectionString> </db> <db name="Oracle" providerName="Oracle.DataAccess.Client" host="XE"> <user>SYSTEM</user> <password>******</password> <connectionString>DATA SOURCE={0};PERSIST SECURITY INFO=True;USER ID={2};Password={3}</connectionString> </db> </Connections> <Converters Active="true"> <!-- 类型转换定义,用于引用(用以提供系统默认类型转vJine.Core.ORM.OrmTypeConverter以外的类型转换支持) --> <Converter name="sbyte_" type="vJine.Core.ORM.TypeConverter+sbyte_, vJine.Core"/> </Converters> <TypeMaps adapter="SQLite"> <!--全局数据类型映射--> <TypeMap adapter="MSSQL" type="string" SQL_TYPE="varchar(70)" Conv="_对应Converter.name(此处不需要,留空即可)"></TypeMap> <!--请依据需求指定,系统默认类型映射参见《vJine.Core ORM 数据类型映射》--> </TypeMaps> <SchemaMaps Active="true"><!--如果Active="false",则或略此项定义--> <!--针对表的数据类型映射--> <Schema Active="true" adapter="SQLite" type="vJineCore_QuickStart.BML.My_Model, vJineCore_QuickStart"><!--如果Active="false",则或略此项定义--> <Map Active="true" Name="Comments" Alias="Comments" IsNullable="true" TrimString="true" Conv="_对应Converter.name(此处不需要,留空即可)"/><!--如果Active="false",则或略此项定义--> </Schema> </SchemaMaps> </OrmConfig> </vJine.Net> </configuration>
2、增删改查:

  除《轮子来袭 vJine.Core Orm 之 01_快速入门》一文中所述的基本增、删、改、查外,您也可以使用如下方式操作:

  

Class<My_Model>.I insert = new Class<My_Model>.I();
insert .Into(
"table_A", "table_B") //不写则默认为类名(My_Model) .Keys(My_Model._.ID, My_Model._.MyStatus, My_Model._.Qty) //不写则默认为所有公共属性 .Values(new_data); dm.E<My_Model>(insert);
Class<My_Model>.D delete = new Class<My_Model>.D();
delete
  .From(
"table_A", "table_B")   .Where(My_Model._.ID.Like("A%") & (My_Model._.MyStatus == My_Model.Status.Ready | My_Model._.MyStatus == My_Model.Status.Running));

dm.E
<My_Model>(delete);
Class<My_Model>.U update = new Class<My_Model>.U();

update
    .Update("table_A", "table_B")
    .Set(My_Model._.Qty.EQ(My_Model._.Qty + 7))
    .Where(My_Model._.ID.Like("A%") & (My_Model._.MyStatus == My_Model.Status.Ready | My_Model._.MyStatus == My_Model.Status.Running));

dm.E<My_Model>(update);
Class<My_Model>.Q querier = new Class<My_Model>.Q();

querier
    .Select(My_Model._.ID, My_Model._.MyStatus, My_Model._.Qty) //只需选择必要的字段即可
    .From("table_A", "table_B", "table_C")
    .Where(My_Model._.ID.Like("A%") & (My_Model._.MyStatus == My_Model.Status.Ready | My_Model._.MyStatus == My_Model.Status.Running));

dm.E
<My_Model>(querier, container);

3、连接、事务及级联调用:

void transaction(DataManager dm) {
       /*
        * 此处将DataManager作为传入参数有其特殊的意义
        * 在常规的业务逻辑中,经常会碰到多个数据库操作方法之间的调用,
        * vJjine.Core ORM考虑的了这种应用,确保了多个方法调用时能共享同一个链接、同一个事物
        * 而同时又降低了代码的复杂度
        */
       dm.Open(); //打开连接
       try {
           dm.Begin(); //开始事物
           //transaction 的一系列数据库操作
           transaction_b(dm); //此处调用transaction_b
           dm.Commit(); //此处提交事物
       } catch (Exception ex) {
           dm.Rollback();
           //处理错误
       } finally {
           dm.Close(); //此处关闭连接
       }
}

void transaction_b(DataManager dm) {
       dm.Open(); //此处共用transaction方法打开的连接
       try {
           dm.Begin(); //此处共用transaction方法开启的事物
           //transaction_b 的一系列数据库操作
           dm.Commit(); //此处并未提交事物
       } catch (Exception ex) {
           dm.Rollback(); 
           //处理错误
       } finally {
           dm.Close(); //此处并未关闭连接
       }
}

 

4、关于辅助类:

public partial class _ /*起这个名字是为了方便操作,框架中并没有对此做限制,之所以起这个名字也是借鉴了其他的ORM框架*/
            /*不必一定声明在业务模型类内部,可依据团队习惯单独定义,同时也不必每个属性都定义,之定义必要的属性即可(参见Class<>.IDUQ)*/ {
    public static readonly Property<My_Model/*包含属性的类*/, string/*需与属性类型完全一致*/> ID = new Property<My_Model/*包含属性的类*/, string>("ID"/*需与属性名完全一致*/);
 }

5、关于充血与贫血:

vJine.Core ORM 采用贫血模型,最大程度的保证了框架的非侵入特性,当然您也可以依据你的意愿进行封装。

 

至此,您已经对vJine.Core ORM框架有了充分的了解,如果有闲暇时间,可以试试亲手操作一下了。

QQ讨论群:115051701,欢迎加入。

原文地址:https://www.cnblogs.com/vjine/p/vJine_Core_Orm_04.html