2012-02-21 90 views
0

我是一個新的nHibernate幫助我保存一個對象和他的連接在基地。 我已經得到了基地,兩個表:NHibernate保存對象在一對一的關係

  • 人(idPerson,名字,secondName,idService
  • 服務(idService,名)

表服務有3個職位(金,銀,燦爛)


的映射:

public class PersonMap:ClassMap<Person> 
    { 
     public PersonMap() 
     { 
      Id(x => x.id); 
      Map(x => x.firstName); 
      Map(x => x.lastName); 
      Map(x => x.status); 
      References(x => x.serviceType).Column("idServiceType"); 
      Table("Person"); 
     } 
    } 
    public class ServiceMap : ClassMap<ServiceType> 
    { 
     public ServiceMap() 
     { 
      Id(x => x.id); 
      Map(x => x.serviceName); 
      Table("Service"); 
     } 
    } 

我使用存儲庫中的下一個方法保存:

public void Saves(Person entity) 
    { 
     using (var session = hibernateHelp.OpenSession()) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 
       ServiceRepository srp = new ServiceRepository(); 
       NHibernateUtil.Initialize(entity.service); 
       session.Save(entity); 
       transaction.Commit(); 
      } 

     } 
    } 

我recive日起(名字= 「我的」 姓氏= 「轉到」 狀態= TRUE,的serviceType = 「金」),然後創建一個人:

Person df=new Person{ 
      firstName="My", 
      lastName="Go", 
      status=true, 
      serviceType=new ServiceType{serviceName="gold"} 
      }; 

當我將它發送到信息庫的方法保存(見上文)的映射工作,並節省在表人新的對象,並在表中創建服務新的註釋。 我不需要在表格服務中創建新的筆記,因爲它包含了一個。如何使救星的方法,以保存鏈接到表服務器,但不創建新的? 我欣賞任何鏈接和建議。

+0

你還可以發佈你的Person和SerciveType映射嗎? – 2012-02-21 20:25:17

+0

添加了我的映射 – 2012-02-22 12:17:11

回答

0
Person newPerson = new Person 
{ 
    FirstName = "My", 
    LastName = "Go", 
    Status = true, 
    serviceType = session.Load<ServiceType>(idOfGold) // returns the service if loaded or a proxy representing it which is enough to save the reference 
    // or 
    serviceType = session.Query<ServiceType>().Where(st.name == "gold").Single() 
}; 

session.Save(newPerson); 
+0

感謝了很多@Firo,如果我在Save方法中創建Person,這將起作用。其實我使用MVC和作爲我收到的答覆(firstName =「我的」,姓氏=「去」,狀態= TRUE,serviceType =「黃金」),那麼我不會創建Person對象並將其發送到方法Save(Person entity )在我的知識庫。任何想法如何可以做到? – 2012-02-22 12:07:19

+0

只是用'ServiceTypeRepository.GetAll()'替換'session.Query ',用'PersonRepository.Save()'替換'session.Save()'。順便說一句,我不喜歡知識庫看到這裏的原因:http://ayende.com/blog/3955/repository-is-the-new-singleton – Firo 2012-02-22 15:17:34

+0

旁註:這將是一個好主意,堅持與.NET命名約定和使用PascalCase for Properties在我的答案中看到 – Firo 2012-02-22 15:18:54