DataRabbit 轻量的数据访问框架(03) -- IOrmAccesser(续)-阿里云开发者社区

开发者社区> zhuweisky> 正文

DataRabbit 轻量的数据访问框架(03) -- IOrmAccesser(续)

简介: 本文将接着 DataRabbit 轻量的数据访问框架 -- IOrmAccesser 继续介绍IOrmAccesser的一些高级功能。这些高级功能需要DataRabbit.ORM.ISmartEntity接口的支持。
+关注继续查看

   本文将接着 DataRabbit 轻量的数据访问框架 -- IOrmAccesser 继续介绍IOrmAccesser的一些高级功能。这些高级功能需要DataRabbit.ORM.ISmartEntity接口的支持。注意,对于Entity class 来说,该接口并不是强制的。

(1)关于含自增字段的Entity插入

     插入后,Entity中对应自增字段的属性将被正确地赋为数据库中自增结果值。


   如果Entity class 继承了ISmartEntity接口,那么这个Entity就是一个“Smart”的Entity,IOrmAccesser针对这样的Entity,它将拥有两种特殊的能力:
(2)partial update:即部分更新的功能。即在Update一个SmartEntity对象时,只更新哪些标记为“dirty”的字段。
   比如,我们以前这样来实现“将ID为30的学生的Email更新”的功能:

            //将ID为30的学生的Email更新
            Student student = stuOrmAccesser.GetOne(new Filter(Student._ID, 30));        
            student.Email 
= "sky@299.com";
            stuOrmAccesser.Update(student);//更新除主键外的所有字段

   但是,如果Student Entity实现了ISmartEntity接口,就可以这么做:
            //将ID为30的学生的Email更新
            Student student = new Student() ;
            student.ID = 30 ;
            student.Email 
= "sky@299.com";
            stuOrmAccesser.Update(student);//仅仅更新“Email”字段

   由于指讲“Email”字段标记为“dirty”,所以在Update时,仅仅会更新“Email”字段的值。

(3)插入前检查:即在向数据库中插入一个SmartEntity对象之前,先检查该对象的状态是否正确,如果不正确,将不会插入,而是抛出InvalidEntityException异常。

   ISmartEntity接口定义与说明如下:
    public interface ISmartEntity
    {
        
/// <summary>
        
/// Clean 将所有Column字段的dirty标记设为false。
        
/// </summary>
        void Clean();

        
/// <summary>
        
/// DirtyColumnList 获取所有需要更新的Column
        
/// </summary>
        IList<string> DirtyColumnList { get; }

        
/// <summary>
        
/// Check 用于检查Entity内部状态是否一致。
        
/// 在将ISmartEntity插入(或更新)到数据库之前,DataRabbit会检查(Check)其状态是否有效,如果无效,则将抛出InvalidEntityException。
        
/// </summary>      
        bool Check(DataAccessType dataAccessType);
    }

    
/// <summary>
    
/// DataAccessType 访问数据库的几种操作类型
    
/// </summary>
    public enum DataAccessType
    {
        Query, Insert, Update, Delete
    }
   
   普通的Entity class可以通过工具自动生成,smart Entity class也可以通过工具自动生成,我写了一个简单的小工具“EntityCreator”来生成Entity class或smart Entity class。生成的Entity class代码中,Check()方法直接返回true,我们可以在这个方法内添加代码以检查当前Entity对象的状态,确保在插入该对象之前,对象的状态是一致、正确的。
   下面是针对前述的Student生成的smart Entity 代码:
img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifStudent
[Serializable]
    
public partial class Student :ISmartEntity 
    {
    
        
#region Force Static Check
        
public const string TableName = "Student" ;
        
public const string _ID = "ID" ;
        
public const string _Name = "Name" ;
        
public const string _Age = "Age" ;
        
public const string _MentorID = "MentorID" ;
        
public const string _Email = "Email" ;
        
public const string _IsBoy = "IsBoy" ;
        
#endregion
    
        
#region Property
    
        
#region ID
        
private System.Int32 m_ID = 0 ; 
        
public System.Int32 ID
        {
            
get
            {
                
return this.m_ID ;
            }
            
set
            {
                
if (!this.dirtyColumnList.Contains("ID"))
                {
                    
this.dirtyColumnList.Add("ID");
                }
                
this.m_ID = value ;
            }
        }
        
#endregion
    
        
#region Name
        
private System.String m_Name = "" ; 
        
public System.String Name
        {
            
get
            {
                
return this.m_Name ;
            }
            
set
            {
                
if (!this.dirtyColumnList.Contains("Name"))
                {
                    
this.dirtyColumnList.Add("Name");
                }
                
this.m_Name = value ;
            }
        }
        
#endregion
    
        
#region Age
        
private System.Int32 m_Age = 0 ; 
        
public System.Int32 Age
        {
            
get
            {
                
return this.m_Age ;
            }
            
set
            {
                
if (!this.dirtyColumnList.Contains("Age"))
                {
                    
this.dirtyColumnList.Add("Age");
                }
                
this.m_Age = value ;
            }
        }
        
#endregion
    
        
#region MentorID
        
private System.Int32 m_MentorID = 0 ; 
        
public System.Int32 MentorID
        {
            
get
            {
                
return this.m_MentorID ;
            }
            
set
            {
                
if (!this.dirtyColumnList.Contains("MentorID"))
                {
                    
this.dirtyColumnList.Add("MentorID");
                }
                
this.m_MentorID = value ;
            }
        }
        
#endregion
    
        
#region Email
        
private System.String m_Email = "" ; 
        
public System.String Email
        {
            
get
            {
                
return this.m_Email ;
            }
            
set
            {
                
if (!this.dirtyColumnList.Contains("Email"))
                {
                    
this.dirtyColumnList.Add("Email");
                }
                
this.m_Email = value ;
            }
        }
        
#endregion
    
        
#region IsBoy
        
private System.Boolean m_IsBoy = false ; 
        
public System.Boolean IsBoy
        {
            
get
            {
                
return this.m_IsBoy ;
            }
            
set
            {
                
if (!this.dirtyColumnList.Contains("IsBoy"))
                {
                    
this.dirtyColumnList.Add("IsBoy");
                }
                
this.m_IsBoy = value ;
            }
        }
        
#endregion
        
#endregion        
        
        
#region ISmartEntity members
        
        
#region DirtyColumnList
        [NonSerialized]
        
private IList<string> dirtyColumnList = new List<string>();
        
public IList<string> DirtyColumnList
        {
            
get { return dirtyColumnList; }
        }
        
#endregion
        
        
#region Clean
        
public void Clean()
        {
            
this.dirtyColumnList.Clear();
        }
        
#endregion
        
        
#region Check 
        
public bool Check(DataAccessType dataAccessType)
        {
            
//可在此添加自己的Entity状态验证逻辑
            return true ;
        }
        
#endregion
        
#endregion
        
        
#region ToString 
        
public override string ToString()
        {
            
return this.ID.ToString()  + " " + this.Name.ToString() ;
        }
        
#endregion
    }


   最后,提供EntityCreator小工具的下载。


返回到:轻量的数据访问框架 --序  


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计
配置的热更新 什么是热更新:这个词听着有点熟悉,但到底是什么呢? 一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnapshot即可    看好了,接下来是步骤: 在添加json配置文件的时候往往没有添加后面两个参数。
1869 0
Nginx代理访问提示ERR_CONTENT_LENGTH_MISMATCH
这种报错一般是因为nginx用户权限不足引起的。 1. 查看日志 打开nginx.conf 配置文件,查看日志位置。 2. 访问让它报错: 3. 修改目录权限 我们看到了它报错无权限,因为我的nginx用户是ftpuser,所以我在/var/lib下执行chown -R ftpuser:ftpuser nginx/修改目录所属用户。
1349 0
干货|如何让机器向“时尚达人”学习?阿里做了个“实用”的图像数据集
阿里资深算法专家雷音带领的团队,有个非常特别的名字,叫做“图像与美”。雷音希望,未来AI产品对衣服的理解不只限于照片和文字,还可以理解衣服本身,进而理解时尚穿搭之道、理解流行风向。
912 0
DLA如何分析Table Store的数据
数据湖(Data Lake)是时下热门的概念,基于数据湖,可以不用做任何ETL、数据搬迁等过程,实现跨各种异构数据源进行大数据关联分析,从而极大的节省成本和提升用户体验。
887 0
开源最佳实践:Android平台页面路由框架ARouter
为了更好地让开发者们更加深入了解阿里开源,阿里云云栖社区在3月1号了举办“阿里开源项目最佳实践”在线技术峰会,直播讲述了当前阿里新兴和经典开源项目实战经验以及背后的开发思路,在本次在线技术峰会上,阿里云资深开发工程师刘志龙分享了Android平台页面路由框架ARouter的技术方案、解决的问题以及在实际场景中的最佳实践。
43648 0
[20121227]v$datafile访问是从数据文件获取信息吗.txt
[20121227]v$datafile访问是从数据文件获取信息吗.txt记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件.
679 0
+关注
zhuweisky
从事软件开发行业十多年,专注于网络通信技术和网络语音视频技术,擅长系统架构设计、系统性能优化等。zhuweisky.cnblogs.com
300
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载