导航

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

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

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

  在Farseer.Net 中 ORM的核心在命名空间:FS.ORM 。

  目前只有4个类文件。其实这4个文件只要是用来做数据库与实体模型之间的映射关系及缓存。至于SQL生成、不同数据库的驱动支持等 在另外的命名空间:FS.Core 中。

  对于ORM来说,我们在转换成数据库操作前,是先让Farseer.Net能“读懂”实体与数据库之间的关系,才能做出对应的SQL生成操作。在本框架中,实际都是最终生成SQL。交由ADO.NET来完成执行数据库操作的。

4个类文件的说明

  Mapping.cs    :映射的核心文件,都是通过该类,来完成对实体与数据库之间的映射过程。

  ModelCache.cs   :映射缓存,致使我们不需要对实体进行重复的反射操作。将会在第一次映射后缓存起来。

  DBAttribute.cs   :顾名思义,是数据库的特性。比如前面我们看到在实体类名称的特征:[DB(Name="xxx表名称",DbIndex = 1)]

  ModelAttribute.cs   :这个是属性字段的映射,包括字段的名称、中文名称、必填、长度、自增列等。

Mapping

  这个对象将会对实体类的表信息、字段信息(多个)进行全面解析。

     /// <summary>
/// ORM 映射关系
/// </summary>
public class Mapping
{
/// <summary>
/// 获取所有属性
/// </summary>
public readonly Dictionary<PropertyInfo, ModelAttribute> ModelList; /// <summary>
/// 关系映射
/// </summary>
/// <param name="type">实体类Type</param>
internal Mapping(Type type) /// <summary>
/// 类属性
/// </summary>
public DBAttribute ClassInfo { get; set; } /// <summary>
/// 自增ID
/// </summary>
public string IndexName { get; set; } /// <summary>
/// 类型
/// </summary>
public Type Type { get; set; } /// <summary>
/// 通过实体类型,返回Mapping
/// </summary>
public static implicit operator Mapping(Type type) /// <summary>
/// 获取当前属性(通过使用的propertyName)
/// </summary>
/// <param name="propertyName">属性名称</param>
public KeyValuePair<PropertyInfo, ModelAttribute> GetModelInfo(string propertyName = "") /// <summary>
/// 获取标注的名称
/// </summary>
/// <param name="propertyInfo">属性变量</param>
/// <returns></returns>
public string GetUserName(PropertyInfo propertyInfo)
}

  Mapping的构造函数传入的是实体类的Type。然后对这个类进行 《类特性》、《属性特性》的转化。同时因为这里涉及到数据库类型及访问方式了,所以Db.Config如果不存在,则会创建这份配置文件出来。

  同时加入对数据验证的错误提示:

                 // 字符串长度判断
if (modelAtt.StringLength != null && modelAtt.StringLength.ErrorMessage.IsNullOrEmpty())
{
if (modelAtt.StringLength.MinimumLength > && modelAtt.StringLength.MaximumLength > )
{
modelAtt.StringLength.ErrorMessage = string.Format("{0},长度范围必需为:{1} - {2} 个字符之间!", modelAtt.Display.Name, modelAtt.StringLength.MinimumLength, modelAtt.StringLength.MaximumLength);
}
else if (modelAtt.StringLength.MaximumLength > )
{
modelAtt.StringLength.ErrorMessage = string.Format("{0},长度不能大于{1}个字符!", modelAtt.Display.Name, modelAtt.StringLength.MaximumLength);
}
else
{
modelAtt.StringLength.ErrorMessage = string.Format("{0},长度不能小于{1}个字符!", modelAtt.Display.Name, modelAtt.StringLength.MinimumLength);
}
} // 值的长度
if (modelAtt.Range != null && modelAtt.Range.ErrorMessage.IsNullOrEmpty())
{
if (modelAtt.Range.Minimum.ConvertType(0m) > && modelAtt.Range.Maximum.ConvertType(0m) > )
{
modelAtt.Range.ErrorMessage = string.Format("{0},的值范围必需为:{1} - {2} 之间!", modelAtt.Display.Name, modelAtt.Range.Minimum.ConvertType(0m), modelAtt.Range.Maximum.ConvertType(0m));
}
else if (modelAtt.Range.Maximum.ConvertType(0m) > )
{
modelAtt.Range.ErrorMessage = string.Format("{0},的值不能大于{1}!", modelAtt.Display.Name, modelAtt.Range.Maximum.ConvertType(0m));
}
else
{
modelAtt.Range.ErrorMessage = string.Format("{0},的值不能小于{1}!", modelAtt.Display.Name, modelAtt.Range.Minimum.ConvertType(0m));
}
}

  通过ModelList,我们可以获取该类的所有字段信息。这对我们在一些项目执行的过程中需要动态的获取类属性的信息是很有需要的。

  GetModelInfo,通过传入数据库字段名称,找到映射的类属性。

  GetFieldName,通过传入类属性,找到映射的数据库字段信息。

ModelCache
 namespace FS.ORM
{
/// <summary>
/// 缓存数据库和实体类的映射关系
/// </summary>
public static class ModelCache
{
/// <summary>
/// 缓存所有实体类
/// </summary>
private static readonly Dictionary<Type, Mapping> ModelList = new Dictionary<Type, Mapping>(); private static readonly object LockObject = new object(); /// <summary>
/// 返回实体类映射的信息
/// </summary>
/// <param name="type">实体类Type</param>
public static Mapping GetInfo(Type type)
{
if (!ModelList.ContainsKey(type))
{
lock (LockObject)
{
if (!ModelList.ContainsKey(type))
{
ModelList.Add(type, new Mapping(type));
}
}
} return ModelList[type];
} /// <summary>
/// 清除缓存
/// </summary>
public static void ClearCache()
{
ModelList.Clear();
}
}
}

  ModelCache对象就是将Mapping进行缓存的操作。通过GetInfo方法,进行缓存并返回Mapping对象。

  因此大家如果需要Mapping对象时,必须通过ModelCache.GetInfo的静态方法进行获取。否则直接操作Mapping对象,将会引发性能问题。

DBAttribute

  存储与数据库的类型、访问方式,及表名称。

     /// <summary>
/// 实体类的属性标记
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public sealed class DBAttribute : Attribute
{
/// <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; }
ModelAttribute

  这里代码比较少,我就不在贴上来了,大家可以到框架中查看。大部份的特性,我们还是利用LINQ TO SQL的。可以减少大家的学习成本。

  主要是针对字段的必填、数据长度、数字值类型的范围、或者正则(可自定义加入如邮件格式、手机格式的验证)。

  另外需要说明的是,默认所有字段都是映射到数据库字段的。如果有一些额外的字段不想加入到字段中。

  可以在字段的特性申明:[NotJoinAttribute(true)],表明该类属性不对数据库的字段进行映射。

导航

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

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

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

广告时间

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

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

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

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

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

 new User { ID = , Name = "张三" }.Insert()

Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. Farseer.net轻量级开源框架 中级篇:执行SQL语句

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 下一篇:Farseer.net轻量级开源框架 中级篇: DbFacto ...

  8. Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 执行SQL语句 下一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 ...

  9. Farseer.net轻量级开源框架 中级篇:数据绑定

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: DbFactory数据工厂 下一篇:Farseer.net轻量级开源框架 中级篇: ...

随机推荐

  1. windows 目录空格

    Window下安装Scala出现:此时不应有 \scala\bin\..\lib\jline-2.14.5.jar 原因很简单,scala默认安装到了Program Files (x86)文件夹下,目 ...

  2. UPDATE command denied DELETE

    可用磁盘空间不足 支持SELECT information_schema. TABLES

  3. Statement 与 PreparedStatement 区别

    Statement由方法createStatement()创建,该对象用于发送简单的SQL语句 PreparedStatement由方法prepareStatement()创建,该对象用于发送带有一个 ...

  4. jsonp突破同源策略,实现跨域訪问请求

    版权声明:本文为博主原创文章,未经博主同意不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] https://blog.csdn.net/xiao ...

  5. bzoj4593: [Shoi2015]聚变反应炉

    这道题的难点其实是在设DP方程,见过就应该会了 令f0,i表示先激发i的父亲,再激发i,把i的整棵子树都激发的最小费用 f1,i表示先激发i,再激发i的父亲,把i的整棵子树都激发的最小费用 设x,y为 ...

  6. YTU 2562: 黄金螺旋

    2562: 黄金螺旋 时间限制: 1 Sec  内存限制: 128 MB 提交: 832  解决: 427 题目描述 黄金螺旋是根据斐波那契数列画出来的螺旋曲线,自然界中存在许多斐波那契螺旋线的图案, ...

  7. linux下的git安装及配置

    一.yum安装方式 1.安装 $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel $ yum -y ...

  8. bzoj 3598: [Scoi2014]方伯伯的商场之旅【数位dp】

    参考了这个http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好写 大概思想就是先计算出把所有石子都合并到1位置的代价,这样显然有一些是不优的,然 ...

  9. 第五篇(那些JAVA程序BUG中的常见单词)

    The left-hand side of an assignment must be a variable 赋值的左侧必须是变量 left-hand side 左边 assignment 赋值

  10. 洛谷 P1540 机器翻译(队列)

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...