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

系统 1740 0

本文将接着 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(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]
public partial class Student:ISmartEntity
{

#region ForceStaticCheck
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.Int32m_ID = 0 ;
public System.Int32ID
{
get
{
return this .m_ID;
}
set
{
if ( ! this .dirtyColumnList.Contains( " ID " ))
{
this .dirtyColumnList.Add( " ID " );
}
this .m_ID = value;
}
}
#endregion

#region Name
private System.Stringm_Name = "" ;
public System.StringName
{
get
{
return this .m_Name;
}
set
{
if ( ! this .dirtyColumnList.Contains( " Name " ))
{
this .dirtyColumnList.Add( " Name " );
}
this .m_Name = value;
}
}
#endregion

#region Age
private System.Int32m_Age = 0 ;
public System.Int32Age
{
get
{
return this .m_Age;
}
set
{
if ( ! this .dirtyColumnList.Contains( " Age " ))
{
this .dirtyColumnList.Add( " Age " );
}
this .m_Age = value;
}
}
#endregion

#region MentorID
private System.Int32m_MentorID = 0 ;
public System.Int32MentorID
{
get
{
return this .m_MentorID;
}
set
{
if ( ! this .dirtyColumnList.Contains( " MentorID " ))
{
this .dirtyColumnList.Add( " MentorID " );
}
this .m_MentorID = value;
}
}
#endregion

#region Email
private System.Stringm_Email = "" ;
public System.StringEmail
{
get
{
return this .m_Email;
}
set
{
if ( ! this .dirtyColumnList.Contains( " Email " ))
{
this .dirtyColumnList.Add( " Email " );
}
this .m_Email = value;
}
}
#endregion

#region IsBoy
private System.Booleanm_IsBoy = false ;
public System.BooleanIsBoy
{
get
{
return this .m_IsBoy;
}
set
{
if ( ! this .dirtyColumnList.Contains( " IsBoy " ))
{
this .dirtyColumnList.Add( " IsBoy " );
}
this .m_IsBoy = value;
}
}
#endregion
#endregion

#region ISmartEntitymembers

#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(DataAccessTypedataAccessType)
{
// 可在此添加自己的Entity状态验证逻辑
return true ;
}
#endregion
#endregion

#region ToString
public override string ToString()
{
return this .ID.ToString() + " " + this .Name.ToString();
}
#endregion
}


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


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


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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论