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

本文将接着 DataRabbit 轻量的数据访问框架 -- IOrmAccesser 继续介绍IOrmAccesser的一些高级功能。这些高级功能需要DataRabbit.ORM.ISmartEntity接口的支持。注意,对于Entity class 来说,该接口并不是强制的。
  如果Entity class 继承了ISmartEntity接口,那么这个Entity就是一个“Smart”的Entity,IOrmAccesser针对这样的Entity,它将拥有两种特殊的能力:
(1)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”字段的值。

(2)插入前检查:即在向数据库中插入一个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 代码:
Student
[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小工具的下载。

原文出处:http://www.cnblogs.com/zhuweisky/
金鳞岂是池中物,一遇风云便化龙