nHibernate提供两种one to one关联:
- primary key associations
- unique foreign key associations
下面分别用mapping by code的方式配置这两种关联。关于如何配置nhibernate使用mapping by code,参考nHibernate Mapping By Code - Introduction
1. primary key associations
- 数据库中无需对Person表和PersonInfo建立任何关系
- Person与其关联的PersonInfo主键值相同
- 可以设置从表(PersonInfo)的主键生成策略为Foreign,使其主键值与主表(Person)保持一致
1.1 实体类
public class Person { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual PersonInfo PersonInfo { get; set; } } public class PersonInfo { public virtual int Id { get; set; } public virtual string PhoneNumber { get; set; } public virtual string Remarks { get; set; } public virtual Person Person { get; set; } }
1.2 数据库表(基于MS SQL Server 2012)
CREATE TABLE [dbo].[Person]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NOT NULL, CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([Id] ASC) CREATE TABLE [dbo].[PersonInfo]( [Id] [int] NOT NULL, [PhoneNumber] [varchar](50) NOT NULL, [Remarks] [varchar](100) NOT NULL, CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([Id] ASC)
1.3 映射类
public class PersonMapping : ClassMapping<Person> { public PersonMapping() { Table("Person"); Id(person => person.Id, map => map.Generator(Generators.Identity)); Property(person => person.Name); OneToOne(person => person.PersonInfo, map => map.Cascade(Cascade.All)); } } public class PersonInfoMapping : ClassMapping<PersonInfo> { public PersonInfoMapping() { Table("PersonInfo"); Id(personInfo => personInfo.Id, map => map.Generator(Generators.Foreign<PersonInfo>(personInfo => personInfo.Person))); Property(personInfo => personInfo.PhoneNumber); Property(personInfo => personInfo.Remarks); OneToOne(personInfo => personInfo.Person, map => map.Constrained(true)); } }
2. unique foreign key associations
- Many to One + Unique 模拟 One to One
- 主表(Customer)须有外键关联从表(CustomerInfo)
2.1 实体类
public class Customer { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual CustomerInfo CustomerInfo { get; set; } } public class CustomerInfo { public virtual int Id { get; set; } public virtual string PhoneNumber { get; set; } public virtual string Remarks { get; set; } public virtual Customer Customer { get; set; } }
2.2 数据库表(基于MS SQL Server 2012)
CREATE TABLE [dbo].[CustomerInfo]( [Id] [int] IDENTITY(1,1) NOT NULL, [PhoneNumber] [varchar](50) NOT NULL, [Remarks] [varchar](50) NOT NULL, CONSTRAINT [PK_CustomerInfo] PRIMARY KEY CLUSTERED ([Id] ASC) CREATE TABLE [dbo].[Customer]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NOT NULL, [CustomerInfoId] [int] NOT NULL Unique, CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ([Id] ASC) ALTER TABLE [dbo].[Customer] ADD CONSTRAINT [FK_Customer_CustomerInfoId] FOREIGN KEY([CustomerInfoId]) REFERENCES [dbo].[CustomerInfo] ([Id])
2.3 映射类
public CustomerMapping() { Table("Customer"); Id(customer => customer.Id, map => map.Generator(Generators.Identity)); Property(customer => customer.Name); ManyToOne(customer => customer.CustomerInfo, map => { map.Cascade(Cascade.All); map.Column("CustomerInfoId"); }); } public CustomerInfoMapping() { Table("CustomerInfo"); Id(customerInfo => customerInfo.Id, map => map.Generator(Generators.Identity)); Property(customerInfo => customerInfo.PhoneNumber); Property(customerInfo => customerInfo.Remarks); OneToOne(customerInfo => customerInfo.Customer, map => map.PropertyReference(typeof(Customer).GetProperty("CustomerInfo"))); }
示例代码基于nHibernate3.3.1
转载请注明出处