程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Active Record學習筆記(二):處理One-To-One映射

Active Record學習筆記(二):處理One-To-One映射

編輯:關於.NET

這篇學習筆記主要介紹了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);
    }
  }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved