读书人

Nhibernate one-to-one映射解决方案

发布时间: 2012-01-08 22:48:50 作者: rapoo

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 "/>

读书人网 >asp.net

热点推荐