本文将接着 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更新
Studentstudent = stuOrmAccesser.GetOne( new Filter(Student._ID, 30 ));
student.Email = " sky@299.com " ;
stuOrmAccesser.Update(student);//更新除主键外的所有字段
Studentstudent = stuOrmAccesser.GetOne( new Filter(Student._ID, 30 ));
student.Email = " sky@299.com " ;
stuOrmAccesser.Update(student);//更新除主键外的所有字段
但是,如果Student Entity实现了ISmartEntity接口,就可以这么做:
//
将ID为30的学生的Email更新
Studentstudent = new Student() ;
student.ID = 30 ;
student.Email = " sky@299.com " ;
stuOrmAccesser.Update(student);//仅仅更新“Email”字段
Studentstudent = 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(DataAccessTypedataAccessType);
}
/// <summary>
/// DataAccessType访问数据库的几种操作类型
/// </summary>
public enum DataAccessType
{
Query,Insert,Update,Delete
}
{
/// <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(DataAccessTypedataAccessType);
}
/// <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
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[Serializable]
publicpartialclassStudent:ISmartEntity
{
#regionForceStaticCheck
publicconststringTableName="Student";
publicconststring_ID="ID";
publicconststring_Name="Name";
publicconststring_Age="Age";
publicconststring_MentorID="MentorID";
publicconststring_Email="Email";
publicconststring_IsBoy="IsBoy";
#endregion
#regionProperty
#regionID
privateSystem.Int32m_ID=0;
publicSystem.Int32ID
{
get
{
returnthis.m_ID;
}
set
{
if(!this.dirtyColumnList.Contains("ID"))
{
this.dirtyColumnList.Add("ID");
}
this.m_ID=value;
}
}
#endregion
#regionName
privateSystem.Stringm_Name="";
publicSystem.StringName
{
get
{
returnthis.m_Name;
}
set
{
if(!this.dirtyColumnList.Contains("Name"))
{
this.dirtyColumnList.Add("Name");
}
this.m_Name=value;
}
}
#endregion
#regionAge
privateSystem.Int32m_Age=0;
publicSystem.Int32Age
{
get
{
returnthis.m_Age;
}
set
{
if(!this.dirtyColumnList.Contains("Age"))
{
this.dirtyColumnList.Add("Age");
}
this.m_Age=value;
}
}
#endregion
#regionMentorID
privateSystem.Int32m_MentorID=0;
publicSystem.Int32MentorID
{
get
{
returnthis.m_MentorID;
}
set
{
if(!this.dirtyColumnList.Contains("MentorID"))
{
this.dirtyColumnList.Add("MentorID");
}
this.m_MentorID=value;
}
}
#endregion
#regionEmail
privateSystem.Stringm_Email="";
publicSystem.StringEmail
{
get
{
returnthis.m_Email;
}
set
{
if(!this.dirtyColumnList.Contains("Email"))
{
this.dirtyColumnList.Add("Email");
}
this.m_Email=value;
}
}
#endregion
#regionIsBoy
privateSystem.Booleanm_IsBoy=false;
publicSystem.BooleanIsBoy
{
get
{
returnthis.m_IsBoy;
}
set
{
if(!this.dirtyColumnList.Contains("IsBoy"))
{
this.dirtyColumnList.Add("IsBoy");
}
this.m_IsBoy=value;
}
}
#endregion
#endregion
#regionISmartEntitymembers
#regionDirtyColumnList
[NonSerialized]
privateIList<string>dirtyColumnList=newList<string>();
publicIList<string>DirtyColumnList
{
get{returndirtyColumnList;}
}
#endregion
#regionClean
publicvoidClean()
{
this.dirtyColumnList.Clear();
}
#endregion
#regionCheck
publicboolCheck(DataAccessTypedataAccessType)
{
//可在此添加自己的Entity状态验证逻辑
returntrue;
}
#endregion
#endregion
#regionToString
publicoverridestringToString()
{
returnthis.ID.ToString()+""+this.Name.ToString();
}
#endregion
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[Serializable]
publicpartialclassStudent:ISmartEntity
{
#regionForceStaticCheck
publicconststringTableName="Student";
publicconststring_ID="ID";
publicconststring_Name="Name";
publicconststring_Age="Age";
publicconststring_MentorID="MentorID";
publicconststring_Email="Email";
publicconststring_IsBoy="IsBoy";
#endregion
#regionProperty
#regionID
privateSystem.Int32m_ID=0;
publicSystem.Int32ID
{
get
{
returnthis.m_ID;
}
set
{
if(!this.dirtyColumnList.Contains("ID"))
{
this.dirtyColumnList.Add("ID");
}
this.m_ID=value;
}
}
#endregion
#regionName
privateSystem.Stringm_Name="";
publicSystem.StringName
{
get
{
returnthis.m_Name;
}
set
{
if(!this.dirtyColumnList.Contains("Name"))
{
this.dirtyColumnList.Add("Name");
}
this.m_Name=value;
}
}
#endregion
#regionAge
privateSystem.Int32m_Age=0;
publicSystem.Int32Age
{
get
{
returnthis.m_Age;
}
set
{
if(!this.dirtyColumnList.Contains("Age"))
{
this.dirtyColumnList.Add("Age");
}
this.m_Age=value;
}
}
#endregion
#regionMentorID
privateSystem.Int32m_MentorID=0;
publicSystem.Int32MentorID
{
get
{
returnthis.m_MentorID;
}
set
{
if(!this.dirtyColumnList.Contains("MentorID"))
{
this.dirtyColumnList.Add("MentorID");
}
this.m_MentorID=value;
}
}
#endregion
#regionEmail
privateSystem.Stringm_Email="";
publicSystem.StringEmail
{
get
{
returnthis.m_Email;
}
set
{
if(!this.dirtyColumnList.Contains("Email"))
{
this.dirtyColumnList.Add("Email");
}
this.m_Email=value;
}
}
#endregion
#regionIsBoy
privateSystem.Booleanm_IsBoy=false;
publicSystem.BooleanIsBoy
{
get
{
returnthis.m_IsBoy;
}
set
{
if(!this.dirtyColumnList.Contains("IsBoy"))
{
this.dirtyColumnList.Add("IsBoy");
}
this.m_IsBoy=value;
}
}
#endregion
#endregion
#regionISmartEntitymembers
#regionDirtyColumnList
[NonSerialized]
privateIList<string>dirtyColumnList=newList<string>();
publicIList<string>DirtyColumnList
{
get{returndirtyColumnList;}
}
#endregion
#regionClean
publicvoidClean()
{
this.dirtyColumnList.Clear();
}
#endregion
#regionCheck
publicboolCheck(DataAccessTypedataAccessType)
{
//可在此添加自己的Entity状态验证逻辑
returntrue;
}
#endregion
#endregion
#regionToString
publicoverridestringToString()
{
returnthis.ID.ToString()+""+this.Name.ToString();
}
#endregion
}
最后,提供 EntityCreator小工具的下载。
返回到: 轻量的数据访问框架 --序