导航

目   录: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. Chart.js docs

    原文链接:http://www.bootcss.com/p/chart.js/docs/ 引入Chart.js文件 首先我们需要在页面中引入Chart.js文件.此工具库在全局命名空间中定义了Char ...

  2. Java内部类用法

    内部类可以是静态(static)的,可以使用 public.protected 和 private 访问控制符,而外部类只能使用 public,或者默认. 成员式内部类 在外部类内部直接定义(不在方法 ...

  3. YTU 2801: 用数字造数字(II)

    2801: 用数字造数字(II) 时间限制: 1 Sec  内存限制: 128 MB 提交: 244  解决: 168 题目描述 输入一个3位以上的整数,求其中最大的两个数字之和与最小的数字之和之间的 ...

  4. .gitignore 使用入门

    .gitignore /doc/ 过滤整个文件夹. *.zip 过滤所有.zip文件. /doc/info.txt 过滤某个具体的文件. 这样,push的时候,就不会上传了,git仓库中就没有了. 假 ...

  5. BZOJ1266:上学路线route (最短路+最小割)

    可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在上学的路途 ...

  6. Java ServerSocket的服务端代码介绍

    转自:http://developer.51cto.com/art/201003/190007.htm 所谓Java ServerSocket通常也称作"套接字",有不少的时候需要 ...

  7. Markdown——让你专注写作

    Markdown--让你专注写作 前些日子,写作的时候总会因为排版而耽误时间,甚至因为排版而把写作的专注力转移到了貌似相关的排版上.诚然,一个好的排版,会让读者有良好的体验,可是对于写作的人来说,这却 ...

  8. linq to EF分组查询 group by 的使用

    第一种:查询表达式语法: IQueryable<EnrollmentDateGroup> data = from student in db.Students group student ...

  9. java.util.Optional

    public class OptionalDemo { public static void main(String[] args) { //创建Optional实例,也可以通过方法返回值得到. Op ...

  10. bzoj 4816: [Sdoi2017]数字表格【莫比乌斯反演+逆元】

    把题意简化,就是要求 \[ \prod_{d=1}^{min(n,m)}f[d]^{\sum_{i=1}^{n}\sum_{j=1}^{m}e[gcd(i,j)==d]} \] 把幂用莫比乌斯反演转化 ...