Farseer.net轻量级开源框架 中级篇:动态数据库访问
上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件
下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换
说到动态数据库的访问,不得不说的是,我们的实体类,是如何找到数据库配置并访问的呢?
回顾下我们的Users类:
[DB(Name = "Members_User")]
public class Users : BaseModel<Users>;
这里有个DB的特性,其中Name 表示 表的名字。群里经常大家问我支持视图吗?视图在SQL上与表的查询语句是一样的哦。所以只需要这里把表名改成视图名就可以啦。
我们看看DB的定义有哪些:
namespace FS.ORM
{
/// <summary>
/// 实体类的属性标记
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public sealed class DBAttribute : Attribute
{
/// <summary>
/// 默认为MSSqlServer 2005、第一个数据库配置
/// </summary>
public DBAttribute()
{
DbIndex = ;
DataType = DataBaseType.SqlServer;
DataVer = "";
} /// <summary>
/// 表名
/// </summary>
public string Name { get; set; } /// <summary>
/// 设置数据库连接配置(Dbconfig)的索引项
/// </summary>
public int DbIndex { get; set; } /// <summary>
/// 设置数据库连接字符串
/// </summary>
public string ConnStr { get; set; } /// <summary>
/// 设置数据库类型
/// </summary>
public DataBaseType DataType { get; set; } /// <summary>
/// 设置数据库版本
/// </summary>
public string DataVer { get; set; } /// <summary>
/// 设置数据库执行T-SQL时间,单位秒默认是30秒
/// </summary>
public int CommandTimeout { get; set; }
}
}
这里存了都是关于这个表与数据库之间的关系及配置。其中构造函数中,默认了DbIndex = 0,这个设置就是我们DbConfigs中的第0个索引的配置。
那么现在知道它是怎么去找到数据库配置了吧。这时候假设我们的~/App_Data/Db.Config 文件里有2个数据库配置。而Users对应的是第2个配置,可以这样写实体类:
[DB(Name = "Members_User", DbIndex = )]
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
/// <summary>
/// 数据库持久化
/// </summary>
public static Bean<TInfo> Data
{
get
{
var bean = new Bean<TInfo>();
DataResult = bean.DataResult;
return bean;
}
}
/// <summary>
/// 默认使用
/// </summary>
/// <param name="tableName">表名称</param>
public Bean(string tableName = "") ///
/// <summary>
/// 兼容Qyn.Factory项目
/// </summary>
/// <param name="dbIndex">数据库配置索引</param>
/// <param name="tableName">表名称</param>
public Bean(int dbIndex, string tableName = "") ///
/// <summary>
/// 兼容Qyn.Factory项目
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="connetionString">连接字符串</param>
/// <param name="commandTimeout">命令执时超时时间</param>
/// <param name="tableName">表名称</param>
public Bean(DataBaseType dbType, string connetionString, int commandTimeout, string tableName = "")
这是BaseCacheModel(缓存逻辑)、BaseCateModel(分类逻辑) 的 Data:
/// <summary>
/// 数据库持久化
/// </summary>
public static CacheBean<TInfo> Data
{
get
{
var bean = new CacheBean<TInfo>();
DataResult = bean.DataResult;
return bean;
}
}
/// <summary>
/// 默认使用
/// </summary>
/// <param name="tableName">表名称</param>
public CacheBean(string tableName = "") /// <summary>
/// 兼容Qyn.Factory项目
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="connetionString">连接字符串</param>
/// <param name="commandTimeout">命令执时超时时间</param>
/// <param name="tableName">表名称</param>
public CacheBean(DataBaseType dbType, string connetionString, int commandTimeout, string tableName = "")
是的,看了他们的构造函数,相信大家都知道怎么使用了吧:
Users.Data.xxxx 与 Bean<Users>.xxxx 是完全一样的使用结果哦。所以有时候我们会这样写代码:
Bean<Users> bean = Users.Data;
bean.Where(......) // 当然你也可以: Bean<Users> bean = new Bean<Users>();
bean.Where(......)
动态改变的时候,你可能会这样:
var bean = new Bean<Users>(DataBaseType.SqlServer, "User ID=sa;Password=123456;Pooling=true;Data Source=.;Initial Catalog=Farseer;", );
这样,bean 就不在按Users定义的数据库源来访问了。
怎么样,简单吧?这章就说到这啦。
上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件
下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换
QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 意为:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
new User { ID = , Name = "张三" }.Insert()
Farseer.net轻量级开源框架 中级篇:动态数据库访问的更多相关文章
- Farseer.net轻量级开源框架 中级篇:数据库切换
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 下一篇:Farseer.net轻量级开源框架 中级篇: SQL执行 ...
- Farseer.net轻量级开源框架 中级篇:SQL执行报告
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 下一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(M ...
- Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: SQL执行报告 下一篇:Farseer.net轻量级开源框架 中级篇: Cooki ...
- Farseer.net轻量级开源框架 中级篇:自定义配置文件
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...
- Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇 ...
- Farseer.net轻量级开源框架 中级篇:UrlRewriter 地址重写
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: Cookies.Session.Request 下一篇:Farseer.net轻量 ...
- Farseer.net轻量级开源框架 中级篇:常用的扩展方法
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...
- Farseer.net轻量级开源框架 中级篇:BasePage、BaseController、BaseHandler、BaseMasterPage、BaseControls基类使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 下一篇:Farseer.net轻量级开源框架 中 ...
- Farseer.net轻量级开源框架 中级篇:事务的使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...
随机推荐
- CCNP路由实验之八 路由重公布
CCNP路由实验之八 路由重公布 在前面几个实验,已经学习了静态路由和动态路由.如今,我们要掌握怎样使它们在一个网络中融合,即路由重公布. 使用出站口作为静态路由 0 使用下一跳地址作为静态路由 ...
- MapReduce的Reduce side Join
1. 简单介绍 reduce side join是全部join中用时最长的一种join,可是这样的方法可以适用内连接.left外连接.right外连接.full外连接和反连接等全部的join方式.r ...
- 蓝桥杯 地宫寻宝 带缓存的DFS
历届试题 地宫取宝 时间限制:1.0s 内存限制:256.0MB 问题描写叙述 X 国王有一个地宫宝库. 是 n x m 个格子的矩阵. 每一个格子放一件宝贝. 每一个宝贝贴着价 ...
- android 特殊符号开头的联系人归并至“#”下
在PeopleActivity界面.联系人的显示位置是由其display name的第一个字符决定的. 数字开头的联系人会显示在"#"这个header下. 中英文联系人会显示在&q ...
- C/C++生成可执行文件过程
编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序.编译的 ...
- data-toggle data-target
data-toggle https://stackoverflow.com/questions/30629974/how-does-the-data-toggle-attribute-work-wha ...
- override (C# Reference)
https://msdn.microsoft.com/en-us/library/ebca9ah3.aspx The override modifier is required to extend o ...
- maven中的三种工程,以及在idea中构建父子工程。
1.pom工程:用在父级工程或聚合工程中.用来做jar包的版本控制.主要是定义POM文件,将后续各个子模块公用的jar包等统一提出来,类似一个抽象父类 2.war工程:将会打包成war,发布在服务器上 ...
- astgo经常死机变慢?试试mysql数据碎片整理吧
使用SSH之类的工具或navicat链接数据库后(注意:是链接数据库后哦,不是直接SSH后就弄,这样提示命令错误的) 执行下面命令(目的是对ASTGO的数据库内除话单之外的所有表进行数据碎片整理,特别 ...
- layui 动态左树导航栏显示样式BUG规避
先看问题现象: 使用 layui 的左树功能,先在html页面添加左树功能引入 <ul class="layui-nav layui-nav-tree layui-nav-side&q ...