Nhibernate one-to-one映射
Person .cs
using System;
using System.Collections.Generic;
using System.Text;
namespace test4
{
public class Person
{
public Person()
{
}
public int PersonId
{
get { return parentId; }
set { parentId = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public Employee Employee
{
get { return employee; }
set { employee = value; }
}
private int parentId;
private string name;
private Employee employee;//=new Employee();
} //class Person
}
Person.hbm.xml:
<?xml version= "1.0 " encoding= "utf-8 " ?>
<hibernate-mapping xmlns= "urn:nhibernate-mapping-2.0 ">
<class name= "test4.Person, test4 " table= "Person ">
<id name= "PersonId " column= "person_id " type= "Int32 " unsaved-value= "0 ">
<generator class= "identity " />
</id>
<property name= "Name " column= "Name " type= "String "/>
<one-to-one
name= "Employee "
cascade= "all "
class= "test4.Employee, test4 "
/>
</class>
</hibernate-mapping>
Employee .cs:
using System;
using System.Collections.Generic;
using System.Text;
namespace test4
{
public class Employee
{
public Employee()
{
}
public int PersonId
{
get { return personId; }
set { personId = value; }
}
public string Job
{
get { return job; }
set { job = value; }
}
public Person Person
{
get { return person; }
set { person = value; }
}
private int personId;
private string job;
private Person person;//=new Person();
} //class Employee
}
Employee.hbm.xml:
<?xml version= "1.0 " encoding= "utf-8 " ?>
<hibernate-mapping xmlns= "urn:nhibernate-mapping-2.0 ">
<class name= "test4.Employee, test4 " table= "Employee ">
<id name= "PersonId " column= "person_id " type= "Int32 " unsaved-value= "0 ">
<generator class= "foreign ">
<param name= "property "> Person </param>
</generator>
</id>
<property name= "Job " column= "Job " type= "String "/>
<one-to-one
name= "Person "
cascade= "all "
class= "test4.Person, test4 "
/>
</class>
</hibernate-mapping>
Program.cs:
using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
namespace test4
{
class Program
{
static void Main(string[] args)
{
Configuration config = new Configuration().AddAssembly( "test4 ");
ISessionFactory factory = config.BuildSessionFactory();
ISession session = factory.OpenSession();
Person p = new Person();
p.Name = "test1 ";
Employee e = new Employee();
e.PersonId = 1;
e.Job = "test2 ";
e.Person = p;
p.Employee = e;
// session.Save( p ); 错误! 不能保存产生主健的一方.
session.Save(e); // 保存关联的另一方, 同时会保存产生主健的一方.
//session.Close();
// Employee e2 = (Employee)session.Load(typeof(Employee), p.PersonId);
// //Assertion.AssertNotNull( "load fail! ", e2);
//// Assertion.AssertNotNull( "load fail! ", e2.Person);
// Person p2 = (Person)session.Load(typeof(Person), p.PersonId);
// //Assertion.AssertNotNull( "load fail! ", p2);
//// Assertion.AssertNotNull( "load fail! ", p2.Employee);
// session.Delete(p2);
session.Close();
}
}
}
[解决办法]
看来你的外键表为Employee
那么修改Employee.hbm.xml:
<one-to-one name= "Person " cascade= "all " class= "test4.Person, test4 " constrained= "true "/>