Active Record学习笔记(二):处理One-To-One映射

上一篇学习笔记:ActiveRecord学习笔记(一):初步接触

这篇学习笔记主要介绍了ActiveRecord如何处理One-To-One映射。本文涉及两个实体类User(用户)和NativePalce(祖籍),两个类是一对一的关系:


主要内容:
1.编写数据库脚本
2.OneToOne属性说明
3.编写实体类
4.编写表示层调用代码

一、编写数据库脚本
--User类对应的数据表
Create Table [Users]
(
    
[ID] Int Identity(1,1Primary Key,
    
[LoginName] Varchar(50not null,
    
[Password] Varchar(20not 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);
        }

    }

}

posted @ 2006-08-29 04:58  Jailu  阅读(898)  评论(0编辑  收藏  举报