(完全限定類名:
DataRabbit.ORM.IEntityRelationLoader
)
在DataRabbit框架提供的ORM功能之中,除了IOrmAccesser接口展現的核心ORM功能外,IEntityRelationLoader接口也提供了一些有意義的功能。正如其名,IEntityRelationLoader是通過數據表的主外鍵關系來加載當前Entity的Parent和Children。
現在對我們前面示例經常用到的Student數據表做個擴充,假設,Student表的MentorID字段作為外鍵,指向Mentor表;而且,Book表中的StudentID字段也是外鍵,指向Student表。這種主外鍵關系的含義是:“一個學生有一個導師,并且擁有多本書”。這三個表的關系圖如下所示:
通過對Student擴充后,我們可以為Student Entity Class 加上如下兩個屬性,來反映這種關系:
現在,我們來調用如下語句:
我們可以從DataRabbit的入口點 IDataAccesser 接口獲取IEntityRelationLoader引用:
通過上面的示例,我們對IEntityRelationLoader的功能已經有了一些了解。下面我們來看看這個接口的全貌:
轉到: DataRabbit 輕量的數據訪問框架 -- 序
在DataRabbit框架提供的ORM功能之中,除了IOrmAccesser接口展現的核心ORM功能外,IEntityRelationLoader接口也提供了一些有意義的功能。正如其名,IEntityRelationLoader是通過數據表的主外鍵關系來加載當前Entity的Parent和Children。
現在對我們前面示例經常用到的Student數據表做個擴充,假設,Student表的MentorID字段作為外鍵,指向Mentor表;而且,Book表中的StudentID字段也是外鍵,指向Student表。這種主外鍵關系的含義是:“一個學生有一個導師,并且擁有多本書”。這三個表的關系圖如下所示:

通過對Student擴充后,我們可以為Student Entity Class 加上如下兩個屬性,來反映這種關系:
#region
Mentor
[ NonSerialized ]
private Mentor m_Mentor = null ;
public Mentor Mentor
{
get
{
return this .m_Mentor;
}
set
{
this .m_Mentor = value;
}
}
#endregion
#region BookList
[ NonSerialized ]
private IList < Book > m_BookList = null ;
public IList < Book > BookList
{
get
{
return this .m_BookList;
}
set
{
this .m_BookList = value;
}
}
#endregion
我將這種通過主外鍵關系得到的屬性稱為“FamilyRelation”屬性,如果使用
EntityCreator
工具生成Entity Class,這些屬性都會根據數據表關系而自動生成。
[ NonSerialized ]
private Mentor m_Mentor = null ;
public Mentor Mentor
{
get
{
return this .m_Mentor;
}
set
{
this .m_Mentor = value;
}
}
#endregion
#region BookList
[ NonSerialized ]
private IList < Book > m_BookList = null ;
public IList < Book > BookList
{
get
{
return this .m_BookList;
}
set
{
this .m_BookList = value;
}
}
#endregion
現在,我們來調用如下語句:
Studentstudent
=
stuOrmAccesser.GetOne(
new
Filter
(Student._ID,
30
));
結果會發現,返回的student對象的Mentor屬性和BookList屬性不會被填充。如果不使用IEntityRelationLoader接口,而是直接通過IOrmAccesser來獲取這個student的“Family”,我們需要這樣做:
Student student
=
stuOrmAccesser.GetOne(
new
Filter
(Student._ID,
30
));
student.Mentor = stuOrmAccesser.GetParent < Mentor > (student);
student.BookList = stuOrmAccesser.GetChildList < Book > (student);
像這樣子可以達到目的,但是未免繁瑣了一點,如果Student表有多個外鍵,則我們就要調用多次GetParent()方法來分別獲取各個Parent;對于多個Children,也是如此。IEntityRelationLoader接口使得這種基于關系的加載變得非常簡單,如上述功能使用下面的代碼即可實現:
student.Mentor = stuOrmAccesser.GetParent < Mentor > (student);
student.BookList = stuOrmAccesser.GetChildList < Book > (student);
entityRelationLoader.
LoadFamily
(student);
LoadFamily
方法一次調用可以加載當前student對象的所有“Family”成員(注意,這里的加載“Family”只包括加載自己Parent和Children,而不包括更上的grandfather或更下的grandson等)。
我們可以從DataRabbit的入口點 IDataAccesser 接口獲取IEntityRelationLoader引用:
IEntityRelationLoader
entityRelationLoader
=
dataAccesser.GetEntityRelationLoader(
null
);
通過上面的示例,我們對IEntityRelationLoader的功能已經有了一些了解。下面我們來看看這個接口的全貌:
public
interface
IEntityRelationLoader
:
ITransactionAccesser
{
/// <summary>
/// LoadChildren加載自己的children到對應的屬性字段(如果Entity提供了這些屬性字段,并且屬性可寫)上。
/// </summary>
void LoadChildren( object entity);
/// <summary>
/// LoadParents加載自己的parents到對應的屬性字段(如果Entity提供了這些屬性字段,并且屬性可寫)上。
/// </summary>
void LoadParents( object entity);
/// <summary>
/// LoadFamily加載自己的parents和children到對應的屬性字段(如果Entity提供了這些屬性字段,并且屬性可寫)上。
/// </summary>
void LoadFamily( object entity);
/// <summary>
/// LoadOffspring以當前entity為根,加載所有后代。注意,自己以及后代的所有Parent屬性都不會被賦值。
/// </summary>
void LoadOffspring( object entity);
}
{
/// <summary>
/// LoadChildren加載自己的children到對應的屬性字段(如果Entity提供了這些屬性字段,并且屬性可寫)上。
/// </summary>
void LoadChildren( object entity);
/// <summary>
/// LoadParents加載自己的parents到對應的屬性字段(如果Entity提供了這些屬性字段,并且屬性可寫)上。
/// </summary>
void LoadParents( object entity);
/// <summary>
/// LoadFamily加載自己的parents和children到對應的屬性字段(如果Entity提供了這些屬性字段,并且屬性可寫)上。
/// </summary>
void LoadFamily( object entity);
/// <summary>
/// LoadOffspring以當前entity為根,加載所有后代。注意,自己以及后代的所有Parent屬性都不會被賦值。
/// </summary>
void LoadOffspring( object entity);
}
轉到: DataRabbit 輕量的數據訪問框架 -- 序
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
