這篇學習筆記主要介紹了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); } } }