导航

目   录: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轻量级开源框架 中级篇: 自定义配置文件

下一篇: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轻量级开源框架 中级篇:动态数据库访问的更多相关文章

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

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 下一篇:Farseer.net轻量级开源框架 中级篇: SQL执行 ...

  2. Farseer.net轻量级开源框架 中级篇:SQL执行报告

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 下一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(M ...

  3. Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: SQL执行报告 下一篇:Farseer.net轻量级开源框架 中级篇: Cooki ...

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

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...

  5. Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇 ...

  6. Farseer.net轻量级开源框架 中级篇:UrlRewriter 地址重写

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: Cookies.Session.Request 下一篇:Farseer.net轻量 ...

  7. Farseer.net轻量级开源框架 中级篇:常用的扩展方法

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...

  8. Farseer.net轻量级开源框架 中级篇:BasePage、BaseController、BaseHandler、BaseMasterPage、BaseControls基类使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 下一篇:Farseer.net轻量级开源框架 中 ...

  9. Farseer.net轻量级开源框架 中级篇:事务的使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...

随机推荐

  1. samba add new smbpasswd & recycle

    建立新账号(XXXXX)的范列: sudo useradd XXXXX -m   #建立本机用户且home下建文件夹 sudo smbpasswd XXXXX -a   #建立samba用戶且设定密码 ...

  2. 文本分类——NaiveBayes

    前面文章已经介绍了朴素贝叶斯算法的原理,这里基于NavieBayes算法对newsgroup文本进行分类測试. 文中代码參考:http://blog.csdn.net/jiangliqing1234/ ...

  3. C++学习之构造函数中的异常处理

    构造函数中可不可以抛出异常?当然可以.从语法上来说,是可以的:从实际情况来看,现在的软件系统日渐庞大和复杂,很难保证 Constructor 在执行过程中完全不发生一点异常. 那么,如果构造函数中抛出 ...

  4. sdut 4-1 复数类的运算符重载

    4-1 复数类的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握成员运算符重载及友元运算符重载 要求定义一个复数类.重 ...

  5. [办公自动化]如何在windows7中编辑hosts文件 (提示权限不够)

    请按如下步骤尝试: 1.在开始菜单里,单击“所有程序”,找到“附件”,单击找到里面的“记事本”,右键,然后选择“以管理员身份运行”,如果有对话框,选择“是”.2.然后单击记事本窗口的“文件”菜单,选择 ...

  6. HNOI模拟 Day3.23

    一.拓扑(top)[ 题目描述]:给你一个有向二分图,求他的拓扑序列的个数.[ 输入]:第一行两个数 N,M,表示点数和边数.接下来 M 行每行两个数 a,b,表示 a 向 b 有一条有向边.[ 输出 ...

  7. node.js 在函数内获取当前函数

    js 如何在函数体内部知道 自己在哪个函数内运行呢? 打比方: function a() { // 我想在这里知道我的函数名a和函数function a () {...} } 使用Error的调用栈可 ...

  8. Python执行系统命令并获得输出的几种方法

    [root@a upfc]# ./ffmpeg-linux64-v3.3.1 -i a.mp3 ffmpeg version N-86111-ga441aa90e8-static http://joh ...

  9. android 在代码中设置字体颜色 问题

    项目中需要在代码中控制字体颜色 之前是直接引用资源文件  但是不行 tv.setTextColor(R.color.textColor_black); 无效果   后来在网上找了资料发现 要从reso ...

  10. MySQL-day1数据库的安装与介绍

    一.mysql的安装步骤 以5.7.20版本为例: 第1步: 第2步: 第3步: 第4步: 第5步: 第6步: 第7步: 第8步: 第9步: 第10步: 第11步: 第12步: 第13步: 第14步: ...