(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 代码:
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() ;