zoukankan      html  css  js  c++  java
  • Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射

    导航

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

    上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文

    下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    前言

      上文讲述了数据库上下文,接下来就是数据库中的表与实体类的关联了(映射)。

      先看下我DEMO中的上下文与表实体的关联:

     1 namespace Demo.PO
     2 {
     3  4     public class Table : DbContext<Table>
     5     {
     6         [Set(Name = "Members_User")]
     7         public TableSet<UserVO> User { get; set; }
     8 
     9         [Set(Name = "Members_Role")]
    10         public TableSet<UserRoleVO> UserRole { get; set; }
    11     }
    12 }

      TableSet表操作类:针对数据库表提供的一系列CURD的操作。被TableSet包含的就是表字段了。

    VO实体类

    1、表实体类:

     1 public class UserVO : IEntity<int?>
     2 {
     3     /// <summary> 用户ID </summary>
     4     [Field(IsPrimaryKey = true)]
     5     public int? ID { get; set; }
     6     /// <summary> 用户名 </summary>
     7     [Field()]
     8     public string UserName { get; set; }
     9     /// <summary> 密码 </summary>
    10     public string PassWord { get; set; }
    11     /// <summary> 会员类型 </summary>
    12     public eumGenderType? GenderType { get; set; }
    13     /// <summary> 登陆次数 </summary>
    14     public int? LoginCount { get; set; }
    15     /// <summary> 登陆IP </summary>
    16     public string LoginIP { get; set; }
    17     /// <summary> 登陆IP </summary>
    18     [Field(Name = "getdate()")]
    19     public DateTime? GetDate { get; set; }
    20     /// <summary> 创建时间 </summary>
    21     public DateTime? CreateAt { get; set; }
    22 }

      可以看到,我们具体的实体,其实是一个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的接口代码吧:

     1 namespace FS.Core.Infrastructure
     2 {
     3     /// <summary> 通过实体类的继承后,后续Set、扩展方法提供针对主键的Where条件 </summary>
     4     /// <typeparam name="T"></typeparam>
     5     public interface IEntity<T>
     6     {
     7         /// <summary> 主键ID </summary>
     8         T ID { get; set; }
     9     }
    10 
    11     /// <summary> 通过实体类的继承后,后续Set、扩展方法提供针对主键的Where条件(默认为int?) </summary>
    12     public interface IEntity : IEntity<int?> { }
    13 }

      接口只有一个属性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中。大家可以直接在源代码里面去查找

    FieldAttribute特性介绍

    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 将不映射数据库

       这是在我们类属性(字段中)申明的。

    SetAttribute特性介绍

    3、第2个常用特性:指定表名、视图名、存储过程名称

      目前只有一个Name属性。

    序号 变量 注释 类型 适用范围 说明
     1  Name  表名称、视图名称、存储过程名称  string  全部  

    指定表、视图、存储过程的名称

    未显示指定时,默认使用当前的类名称作为缺省名称

       它是在上下文中的Set属性上申明的特性。可以参考上面出现的:Table类。

    总结

      相信通过上文的说明,大家知道如何进行数据库的映射了。

      今天这篇与昨天的,都是环境搭建过程而已。

      到了下一篇,就开始讲解实质性的数据库操作了。希望给大家带来惊喜!

    导航

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

    上一篇: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的目标是:快速上手、快速开发、简单方便。

    1 Table.Data.User.Where(o=>o.ID == 1).ToEntity();
    2 Table.Data.User.Where(o=>o.ID > 1).ToList();
    3 Table.Data.User.Where(o=>o.ID != 0).Delete();
    4 Table.Data.User.Where(o=>o.ID != 0).AddUp(o=>o.LoginCount, 1);
    5 Table.Data.User.Where(o=>o.ID == 1).Update(new User{ UserName = "newName" });
    6 Table.Data.User.Insert(new User{ UserName = "newName" });
  • 相关阅读:
    特性(Attribute)
    泛型
    AngularJS 基础用法
    js date相关学习!
    android 数据存储分配的一些事
    angularjs model.service vs provider vs factory?
    angularJS 判断
    zepto.js 学习之(一)
    angularJS Directive学习
    AngularJS继续中
  • 原文地址:https://www.cnblogs.com/steden/p/4555262.html
Copyright © 2011-2022 走看看