• Farseer.net轻量级开源框架 中级篇:动态数据库访问


    导航

    目   录:Farseer.net轻量级开源框架 目录

    上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件

    下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换

      说到动态数据库的访问,不得不说的是,我们的实体类,是如何找到数据库配置并访问的呢?

      回顾下我们的Users类:

    1     [DB(Name = "Members_User")]
    2     public class Users : BaseModel<Users>;

      这里有个DB的特性,其中Name 表示 表的名字。群里经常大家问我支持视图吗?视图在SQL上与表的查询语句是一样的哦。所以只需要这里把表名改成视图名就可以啦。

      我们看看DB的定义有哪些:

     1 namespace FS.ORM
     2 {
     3     /// <summary>
     4     ///     实体类的属性标记
     5     /// </summary>
     6     [AttributeUsage(AttributeTargets.Class)]
     7     public sealed class DBAttribute : Attribute
     8     {
     9         /// <summary>
    10         ///     默认为MSSqlServer 2005、第一个数据库配置
    11         /// </summary>
    12         public DBAttribute()
    13         {
    14             DbIndex = 0;
    15             DataType = DataBaseType.SqlServer;
    16             DataVer = "2005";
    17         }
    18 
    19         /// <summary>
    20         ///     表名
    21         /// </summary>
    22         public string Name { get; set; }
    23 
    24         /// <summary>
    25         ///     设置数据库连接配置(Dbconfig)的索引项
    26         /// </summary>
    27         public int DbIndex { get; set; }
    28 
    29         /// <summary>
    30         ///     设置数据库连接字符串
    31         /// </summary>
    32         public string ConnStr { get; set; }
    33 
    34         /// <summary>
    35         ///     设置数据库类型
    36         /// </summary>
    37         public DataBaseType DataType { get; set; }
    38 
    39         /// <summary>
    40         ///     设置数据库版本
    41         /// </summary>
    42         public string DataVer { get; set; }
    43 
    44         /// <summary>
    45         ///     设置数据库执行T-SQL时间,单位秒默认是30秒
    46         /// </summary>
    47         public int CommandTimeout { get; set; }
    48     }
    49 }

      这里存了都是关于这个表与数据库之间的关系及配置。其中构造函数中,默认了DbIndex = 0,这个设置就是我们DbConfigs中的第0个索引的配置。

      那么现在知道它是怎么去找到数据库配置了吧。这时候假设我们的~/App_Data/Db.Config  文件里有2个数据库配置。而Users对应的是第2个配置,可以这样写实体类:

    1     [DB(Name = "Members_User", DbIndex = 1)]
    2     public class Users : BaseModel<Users>

      这样Farrseer.Net 就会到DbIndex 的第二个去取数据库的配置啦。当然默认是0,所以我们不需要显示的申明。

    如何动态变更不同的数据库

      上面所说的DbIndex 是对实体类在运行时的固定绑定。但有时候,我们的项目可能是动态的数据源。比如有可能,每个用户都是独立的数据库。而他们的表结构是完全一样的。这个时候,就需要能支持动态(运行时改变)的方式。

      在BaseModel普通逻辑中,Users.Data 返回的是Bean<Users>类型。而BaseCacheModel(缓存逻辑)、BaseCateModel(分类逻辑) 的  Data 是CacheBean<Users>类型。之所以分开两种类型,主要是考虑到缓存逻辑的操作有所差异,主要在查询数据上,因为缓存的数据都保存在本地变量中。而Data操作的是数据库的。所以在CacheBean<Users> 没有对数据库的查询操作方法。

      而我们要动态改变数据库源,就是通过Bean<Users>或者CacheBean<Users>的构造函数来支持的。默认Data采用的是默认的参数,即实体类的DbIndex。直接贴上代码,看看Data是如何实例这些的吧:

      这是普通逻辑层(BaseModel)的Data

     1         /// <summary>
     2         ///     数据库持久化
     3         /// </summary>
     4         public static Bean<TInfo> Data
     5         {
     6             get
     7             {
     8                 var bean = new Bean<TInfo>();
     9                 DataResult = bean.DataResult;
    10                 return bean;
    11             }
    12         }
     1         /// <summary>
     2         ///     默认使用
     3         /// </summary>
     4         /// <param name="tableName">表名称</param>
     5         public Bean(string tableName = "")
     6 
     7         /// 
     8         /// <summary>
     9         ///     兼容Qyn.Factory项目
    10         /// </summary>
    11         /// <param name="dbIndex">数据库配置索引</param>
    12         /// <param name="tableName">表名称</param>
    13         public Bean(int dbIndex, string tableName = "")
    14 
    15         /// 
    16         /// <summary>
    17         ///     兼容Qyn.Factory项目
    18         /// </summary>
    19         /// <param name="dbType">数据库类型</param>
    20         /// <param name="connetionString">连接字符串</param>
    21         /// <param name="commandTimeout">命令执时超时时间</param>
    22         /// <param name="tableName">表名称</param>
    23         public Bean(DataBaseType dbType, string connetionString, int commandTimeout, string tableName = "")

      这是BaseCacheModel(缓存逻辑)、BaseCateModel(分类逻辑) 的  Data:

     1         /// <summary>
     2         ///     数据库持久化
     3         /// </summary>
     4         public static CacheBean<TInfo> Data
     5         {
     6             get
     7             {
     8                 var bean = new CacheBean<TInfo>();
     9                 DataResult = bean.DataResult;
    10                 return bean;
    11             }
    12         }
     1         /// <summary>
     2         ///     默认使用
     3         /// </summary>
     4         /// <param name="tableName">表名称</param>
     5         public CacheBean(string tableName = "")
     6 
     7         /// <summary>
     8         ///     兼容Qyn.Factory项目
     9         /// </summary>
    10         /// <param name="dbType">数据库类型</param>
    11         /// <param name="connetionString">连接字符串</param>
    12         /// <param name="commandTimeout">命令执时超时时间</param>
    13         /// <param name="tableName">表名称</param>
    14         public CacheBean(DataBaseType dbType, string connetionString, int commandTimeout, string tableName = "")

      是的,看了他们的构造函数,相信大家都知道怎么使用了吧:

      Users.Data.xxxx 与 Bean<Users>.xxxx 是完全一样的使用结果哦。所以有时候我们会这样写代码:

    1   Bean<Users> bean = Users.Data;
    2   bean.Where(......)
    3 
    4 // 当然你也可以:
    5 
    6     Bean<Users> bean = new Bean<Users>();
    7   bean.Where(......)

      动态改变的时候,你可能会这样:

    1 var bean = new Bean<Users>(DataBaseType.SqlServer, "User ID=sa;Password=123456;Pooling=true;Data Source=.;Initial Catalog=Farseer;", 30);

      这样,bean 就不在按Users定义的数据库源来访问了。

      怎么样,简单吧?这章就说到这啦。

    导航

    目   录:Farseer.net轻量级开源框架 目录

    上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件

    下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换

    广告时间

    QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net

    Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。

    Farseer 意为:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。

    ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)

    Farseer.Net的目标是:快速上手、快速开发、简单方便。

    1 new User { ID = 1, Name = "张三" }.Insert()
  • 相关阅读:
    [atARC123F]Insert Addition
    3.1 概述
    2.5 信道的极限容量
    2.4 编码与调制
    2.3 传输方式
    tp6_004路由配置
    tp6_003多应用配置
    tp6_002规范和配置
    tp6_001安装和运行
    问题解决:tp6多应用无法获取controller 和 action怎么办
  • 原文地址:https://www.cnblogs.com/steden/p/4079352.html
Copyright © 2020-2023  润新知