這篇學習筆記主要介紹了ActiveRecord如何處理One-To-One映射。本文涉及兩個實體類User(用戶)和NativePalce(祖籍),兩個類是一對一的關系:

主要內容:
1.編寫數據庫腳本
2.OneToOne屬性說明
3.編寫實體類
4.編寫表示層調用代碼
一、編寫數據庫腳本
--User類對應的數據表
Create Table [Users] ( [ID] Int Identity(1,1) Primary Key, [LoginName] Varchar(50) not null, [Password] Varchar(20) not null )
--NativePlace類對應的數據表
Create Table [NativePlace] ( ID int Primary Key, City Varchar(50), Province Varchar(50) )
在編寫數據庫時需要注意的是:
1.副表NativePalce的主鍵不能為自增類型;
2.主表Users和副表NativePalce的主鍵名必須一致。
二、OneToOne屬性說明:
在Castle.ActiveRecord中,用OneToOne屬性代替NHibernate配置文件中的<OneToOne></OneToOne>標簽。具有以下子屬性:
a.cascade:(可選) 表明操作是否從父對象級聯到被關聯的對象
b.constrained:(可選) 表明該類對應的表對應的數據庫表,和被關聯的對象所對應的數據庫表之間,通過一個外鍵引用對主鍵進行約束。這個選項影響Save()和Delete()在級聯執行時的先後順序(也在schema export tool中被使用)
c.outer-join:(可選 - 默認為 auto):當設置hibernate.use_outer_join的時候,對這個關聯允許外連接抓取
d.access:(可選 - defaults to property): 用來訪問屬性的策略
e.CustomAccess:還不知道干嘛滴
三、編寫實體類
本文使用主鍵關聯處理一對一的關系。
主鍵關聯不需要額外的表字段;兩行是通過這種一對一關系相關聯的,那麼這兩行就共享同樣的主關鍵字值。所以如果你希望兩個對象通過主鍵一對一關聯,你必須確認它們被賦予同樣的標識值!
1.在上篇文章中的User類中增加屬性NativePlace和字段objNativePlace public class User :
ActiveRecordBase
{
//
private NativePlace objNativePlace;
//
[OneToOne(Cascade = CascadeEnum.All)]
public NativePlace NativePlace
{
get
{
if (objNativePlace == null)
{
objNativePlace = new NativePlace();
}
return objNativePlace;
}
set
{
objNativePlace = value;
}
}
}
2.編寫實體類NativePlace /**//// <summary>
/// 祖籍信息
/// </summary>
[ActiveRecord] //類名與數據表名一樣,也可以不寫明映射的數據表名
public class NativePlace : ActiveRecordBase
{
private int intID;
private string strCity;
private string strProvince;
private User objUser;
//注意此處的主鍵類型
[PrimaryKey(PrimaryKeyType.Foreign)]
public int ID
{
get
{
return intID;
}
set
{
intID = value;
}
}
/**//// <summary>
/// 省
/// </summary>
[Property]
public string Province
{
get
{
return strProvince;
}
set
{
strProvince = value;
}
}
/**//// <summary>
/// 城市
/// </summary>
[Property]
public string City
{
get
{
return strCity;
}
set
{
strCity = value;
}
}
[OneToOne]
public User User
{
get
{
if (objUser == null)
{
objUser = new User();
}
return objUser;
}
set
{
objUser = value;
}
}
}
3.配置文件:以上篇文章的一樣
四、編寫表示層調用代碼(只列出新增User的過程):
private void btnAddNewUser_Click(object sender, EventArgs e)
{
IConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord") as IConfigurationSource;
ActiveRecordStarter.Initialize(source, typeof(User), typeof(NativePlace));
//使用事務處理
using (TransactionScope tran = new TransactionScope())
{
try
{
User objUser = new User();
objUser.Name = "jailu";
objUser.Password = "123456789";
NativePlace objNativePlace = new NativePlace();
objNativePlace.City = "LongYan";
objNativePlace.Province = "FuJian";
//指出對應關系
objUser.NativePlace = objNativePlace;
objNativePlace.User = objUser;
objUser.Save(); //保存objUser對象
tran.VoteCommit(); //執行事務
MessageBox.Show("Success!");
}
catch(Exception ex)
{
tran.VoteRollBack(); //若出現異常,回滾事務
MessageBox.Show("Fail!" + ex.Message);
}
}
}