首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

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

2012-01-08 
Nhibernate one-to-one映射Person.csusingSystemusingSystem.Collections.GenericusingSystem.Textname

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

热点排行