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轻量级开源框架 中级篇:自定义配置文件
-
Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂
-
Farseer.net轻量级开源框架 中级篇:动态数据库访问
-
Farseer.net轻量级开源框架 中级篇:常用的扩展方法
-
Farseer.net轻量级开源框架 入门篇:添加数据详解
-
Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂
-
Farseer.net轻量级开源框架 中级篇:动态数据库访问
-
Farseer.net轻量级开源框架 中级篇:自定义配置文件