天天看点

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

(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 = "[email protected]";

            stuOrmAccesser.Update(student);//更新除主键外的所有字段

   但是,如果Student Entity实现了ISmartEntity接口,就可以这么做:

            Student student = new Student() ;

            student.ID = 30 ;

            stuOrmAccesser.Update(student);//仅仅更新“Email”字段

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

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

   ISmartEntity接口定义与说明如下:

    public interface ISmartEntity

    {

        /// <summary>

        /// Clean 将所有Column字段的dirty标记设为false。

        /// </summary>

        void Clean();

        /// DirtyColumnList 获取所有需要更新的Column

        IList<string> DirtyColumnList { get; }

        /// Check 用于检查Entity内部状态是否一致。

        /// 在将ISmartEntity插入(或更新)到数据库之前,DataRabbit会检查(Check)其状态是否有效,如果无效,则将抛出InvalidEntityException。

        /// </summary>      

        bool Check(DataAccessType dataAccessType);

    }

    /// <summary>

    /// DataAccessType 访问数据库的几种操作类型

    /// </summary>

    public enum DataAccessType

        Query, Insert, Update, Delete

   下面是针对前述的Student生成的smart Entity 代码:

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

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 ;

        }

        #region Name

        private System.String m_Name = "" ; 

        public System.String Name

                return this.m_Name ;

                if (!this.dirtyColumnList.Contains("Name"))

                    this.dirtyColumnList.Add("Name");

                this.m_Name = value ;

        #region Age

        private System.Int32 m_Age = 0 ; 

        public System.Int32 Age

                return this.m_Age ;

                if (!this.dirtyColumnList.Contains("Age"))

                    this.dirtyColumnList.Add("Age");

                this.m_Age = value ;

        #region MentorID

        private System.Int32 m_MentorID = 0 ; 

        public System.Int32 MentorID

                return this.m_MentorID ;

                if (!this.dirtyColumnList.Contains("MentorID"))

                    this.dirtyColumnList.Add("MentorID");

                this.m_MentorID = value ;

        #region Email

        private System.String m_Email = "" ; 

        public System.String Email

                return this.m_Email ;

                if (!this.dirtyColumnList.Contains("Email"))

                    this.dirtyColumnList.Add("Email");

                this.m_Email = value ;

        #region IsBoy

        private System.Boolean m_IsBoy = false ; 

        public System.Boolean IsBoy

                return this.m_IsBoy ;

                if (!this.dirtyColumnList.Contains("IsBoy"))

                    this.dirtyColumnList.Add("IsBoy");

                this.m_IsBoy = value ;

        #endregion        

        #region ISmartEntity members

        #region DirtyColumnList

        [NonSerialized]

        private IList<string> dirtyColumnList = new List<string>();

        public IList<string> DirtyColumnList

            get { return dirtyColumnList; }

        #region Clean

        public void Clean()

            this.dirtyColumnList.Clear();

        #region Check 

        public bool Check(DataAccessType dataAccessType)

            //可在此添加自己的Entity状态验证逻辑

            return true ;

        #region ToString 

        public override string ToString()

            return this.ID.ToString()  + " " + this.Name.ToString() ;