Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射
上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
上文讲述了数据库上下文,接下来就是数据库中的表与实体类的关联了(映射)。
先看下我DEMO中的上下文与表实体的关联:
namespace Demo.PO
{
public class Table : DbContext<Table>
{
[Set(Name = "Members_User")]
public TableSet<UserVO> User { get; set; } [Set(Name = "Members_Role")]
public TableSet<UserRoleVO> UserRole { get; set; }
}
}
TableSet表操作类:针对数据库表提供的一系列CURD的操作。被TableSet包含的就是表字段了。
1、表实体类:
public class UserVO : IEntity<int?>
{
/// <summary> 用户ID </summary>
[Field(IsPrimaryKey = true)]
public int? ID { get; set; }
/// <summary> 用户名 </summary>
[Field()]
public string UserName { get; set; }
/// <summary> 密码 </summary>
public string PassWord { get; set; }
/// <summary> 会员类型 </summary>
public eumGenderType? GenderType { get; set; }
/// <summary> 登陆次数 </summary>
public int? LoginCount { get; set; }
/// <summary> 登陆IP </summary>
public string LoginIP { get; set; }
/// <summary> 登陆IP </summary>
[Field(Name = "getdate()")]
public DateTime? GetDate { get; set; }
/// <summary> 创建时间 </summary>
public DateTime? CreateAt { get; set; }
}
可以看到,我们具体的实体,其实是一个POCO的实体。
没错,在V1.x中,框架的一个改变也是为了减轻实体的”负担“,也让框架更加轻量级,而不是侵入式的。
这里重点说下:[Field(Name = "getdate()")]
在后面我们会讲到Field.Name 是显示的告诉框架这个类属性绑定数据库中对应的表字段名称。
熟悉MSSQL朋友知道,getdate()并不是字段名称,则是MSSQL提供的函数。框架对此也是支持的。
举个例子,表有两个字段,A、B 都是int类型,
我们用SQL对A、B的值相加后进行排序是很容易实现的。
而通过框架,我们可以定义一个类属性,然后Field.Name = "A+B" ,这样我们在排序时,就按照普通的字段进行Desc(o=>o.变量)就可以了。
另外这里继承了IEntity,如前面文章说到的,是为了支持提供的扩展。我们看看IEntity的接口代码吧:
namespace FS.Core.Infrastructure
{
/// <summary> 通过实体类的继承后,后续Set、扩展方法提供针对主键的Where条件 </summary>
/// <typeparam name="T"></typeparam>
public interface IEntity<T>
{
/// <summary> 主键ID </summary>
T ID { get; set; }
} /// <summary> 通过实体类的继承后,后续Set、扩展方法提供针对主键的Where条件(默认为int?) </summary>
public interface IEntity : IEntity<int?> { }
}
接口只有一个属性:ID,大部份,我们的表都有一个主键。这个主键是自动标识的。
继承它后,框架提供了一Where条件自动转换的支持:
/// <summary>
/// 获取下一条记录
/// </summary>
/// <param name="ID">当前ID</param>
/// <param name="ts">TableSet</param>
/// <typeparam name="TEntity">实体类</typeparam>
public static TEntity ToNextEntity<TEntity>(this TableSet<TEntity> ts, int? ID) where TEntity : class, Core.Infrastructure.IEntity, new()
{
return ts.Where(o => o.ID > ID).Asc(o => o.ID).ToEntity();
} /// <summary>
/// 获取上一条记录
/// </summary>
/// <param name="ID">当前ID</param>
/// <param name="ts">TableSet</param>
/// <typeparam name="TEntity">实体类</typeparam>
public static TEntity ToPreviousEntity<TEntity>(this TableSet<TEntity> ts, int? ID) where TEntity : class, Core.Infrastructure.IEntity, new()
{
return ts.Where(o => o.ID < ID).Desc(o => o.ID).ToEntity();
}
/// <summary>
/// 获取下一条记录
/// </summary>
/// <param name="ID">当前ID</param>
/// <param name="ts">TableSet</param>
/// <typeparam name="TEntity">实体类</typeparam>
public static TEntity ToNextEntity<TEntity>(this ViewSet<TEntity> ts, int? ID) where TEntity : class, Core.Infrastructure.IEntity, new()
{
return ts.Where(o => o.ID > ID).Asc(o => o.ID).ToEntity();
} /// <summary>
/// 获取上一条记录
/// </summary>
/// <param name="ID">当前ID</param>
/// <param name="ts">TableSet</param>
/// <typeparam name="TEntity">实体类</typeparam>
public static TEntity ToPreviousEntity<TEntity>(this ViewSet<TEntity> ts, int? ID) where TEntity : class, Core.Infrastructure.IEntity, new()
{
return ts.Where(o => o.ID < ID).Desc(o => o.ID).ToEntity();
}
当然这里没办法贴出所有的扩展方法来,但让大家知道它的目的就是让我们经常操作的:o.ID == x 、o=> IDs.Contains(o.ID) 这些操作变的更加方便,不需要手动敲代码完成。

以上代码在Demo中。大家可以直接在源代码里面去查找
2、我们先来介绍第一个特性:字段的映射
[FieldAttribute]特性目的是告诉框架,当前的这个类属性与数据库的表字段是如何关联在一起的。比如显式的指定表字段的名称。
我们先来看下面的表格:
| 序号 | 变量 | 注释 | 类型 | 适用范围 | 说明 |
| 1 | Name | 数据库字段名称 | string | 全部 |
指定表字段、视图字段名称、存储过程参数的名称、数据库函数 未显示指定时,默认使用当前的类属性名称作为缺省名称 |
| 2 | IsPrimaryKey | 是否为数据库主键 | bool | TableSet |
默认:false 设为:true 并且该变量赋了值是:Insert操作,在MSSQL里,会启用SET IDENTITY_INSERT设置,在Update时,会转换成条件,并去掉赋值。 比如:Table.Data.User.Update(new User{ ID=1,Name="xxx")); 会被转换成:Table.Data.User.Where(o=>o.ID == 1).Update(new User{ Name="xxx")); |
| 3 | InsertStatusType | 插入时字段状态 |
StatusType 枚举类型 |
TableSet |
默认:CanWrite 设为:ReadOnly时,在对应的插入或者更新时,该赋值会被过滤掉(忽略) 设为:ReadCondition时,在对应的插入或者更新时,该赋值会被转换成 == 条件。同时过滤掉赋值(忽略) 这个特性运用的好,对我们编写代码时,可以省去很多Where(o=>o.ID == 1)这种写法,以及安全保护。(禁止被更新,即时赋了值) |
| 4 | UpdateStatusType | 修改时字段状态 | TableSet | ||
| 5 | IsMap | 是否映射到数据库字段中 | bool | 全部 |
默认:true 设为:false 将不映射数据库 |
这是在我们类属性(字段中)申明的。
3、第2个常用特性:指定表名、视图名、存储过程名称
目前只有一个Name属性。
| 序号 | 变量 | 注释 | 类型 | 适用范围 | 说明 |
| 1 | Name | 表名称、视图名称、存储过程名称 | string | 全部 |
指定表、视图、存储过程的名称 未显示指定时,默认使用当前的类名称作为缺省名称 |
它是在上下文中的Set属性上申明的特性。可以参考上面出现的:Table类。
相信通过上文的说明,大家知道如何进行数据库的映射了。
今天这篇与昨天的,都是环境搭建过程而已。
到了下一篇,就开始讲解实质性的数据库操作了。希望给大家带来惊喜!
上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 寓意:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
Table.Data.User.Where(o=>o.ID == ).ToEntity();
Table.Data.User.Where(o=>o.ID > ).ToList();
Table.Data.User.Where(o=>o.ID != ).Delete();
Table.Data.User.Where(o=>o.ID != ).AddUp(o=>o.LoginCount, );
Table.Data.User.Where(o=>o.ID == ).Update(new User{ UserName = "newName" });
Table.Data.User.Insert(new User{ UserName = "newName" });
Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射的更多相关文章
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...
- Farseer.net轻量级ORM开源框架 V1.x 教程目录
本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...
随机推荐
- C项目实践--图书管理系统(4)
前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...
- MVC中从Controller像View层传值
MVC中的Controller不能直接的訪问View层中的控件,那么是怎样的将Controller中值传到View中,经常使用的有4种 ViewData: 是获取或设置视图的字典对象,它里面存放的是键 ...
- bzoj4594: [Shoi2015]零件组装机
论静态查错的重要性...乱搞题真难调 首先这题看起来就是要分治检验了. 考虑对于区间[l,r],分成[l,p-1]和[p,r]使得这两个区间合并可以得到[l,r],并且要保证后面一个区间较大 设前一个 ...
- POJ - 2418 Hardwood Species(map,trie,BST)
1.输入若干行树名,输入结束后,按字典序输出树名及其所占百分比. 2.多种方法:map,trie,BST 3. map: #include<iostream> #include<st ...
- bleve搜索引擎源码分析之索引——mapping真复杂啊
接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...
- 使用C#开发HTTP服务器系列之实现Get和Post
各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.在我们这个Web服务器有了一个基本的门面以后,我们是时候来用它做点实际的事情了.还记得我们 ...
- 创建cell的三种方式
方式一 注册cell -> 无需为cell绑定标识符 [使用UIViewController完成!] l 1> static NSString * const ID = @"c ...
- lmbench andlmbench 移植测试
/*********************************************************************** * lmbench andlmbench 移植测试 * ...
- sqlserver2008Mail
use msdb GO DROP PROC MailTim GO CREATE PROC MailTim @Subject NVARCHAR(100),@Body NVARCHAR( ...
- fzu 2150(bfs)
Problem 2150 Fire Game Accept: 693 Submit: 2657 Time Limit: 1000 mSec Memory Limit : 32768 KB ...