2013-01-21 26 views
1

我有這段代碼用於將我的對象保存到數據庫並且工作正常。通過編號在NHibernate會話中初始化對象

public int CreateOrder(OrderDB orderDB) 
    { 
     using (ISession session = sessionFactory.OpenSession()) 
     { 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 
       try 
       { 
        session.SaveOrUpdate(orderDB.Car); 
        session.SaveOrUpdate(orderDB.Owner); 

        for (int i = 0; i < orderDB.Service.Count; i++) 
        { 
         session.SaveOrUpdate(orderDB.Service[i]); 
        } 
        session.SaveOrUpdate(orderDB); 
        transaction.Commit(); 
       } 
       catch (Exception e) 
       { 
        throw; 
       } 
      } 
     } 
     return orderDB.ID; 
    } 

實體:

public class OrderDB:BasicRecordDB 
{ 
    public virtual int ID { get; set; } 

    public virtual IList<Service> Service { get; set; } 

    public virtual Owner Owner { get; set; } 

    public virtual Car Car { get; set; } 

    public virtual Box Box { get; set; } 

    public virtual double TotalPrise { get; set; } 

    public virtual int OrderNumber { get; set; } 
} 

public class Car 
{ 
    public virtual int ID { get; set; } 

    public virtual string CarNumber { get; set; } 

    public virtual Model Model { get; set; } 

} 

再舉例來說,實體模型(汽車)已經包含在數據庫和保存順序應該是足夠的只是型號ID,但現在它從客戶端發送到服務器的所有實體租車並具有所有屬性的模型。如果我只發送實體id(我的意思是那個已經在數據庫中並擁有私鑰的實體),我可以保存命令嗎?

+0

不清楚您的問題是什麼。從數據庫請求一個'Car'通常不會請求'Model'的數據,因爲它很可能是懶惰加載的。 –

+0

問題是當我想保存從我的客戶端應用程序發送到我的服務器應用程序的所有訂單與所有子實體和它們的屬性。但這是爲了節省我的訂單不需要所有子實體中的所有屬性,因爲某些實體將足夠發送只是id。所以我想在可能的時候發送id。 – user1987891

+0

一個無關的註釋,但是如果你不打算對它做任何事情,只是在重新拋出異常時沒有意義。如果只是這樣做,就試試catch catch塊。 –

回答

1

在這種情況下,我用兩個屬性的方法,以不同的方式表示一個column參考ReferenceId

所以,讓我們先來擴展Car類:

public class Car 
{ 
    ... 
    Model _model 

    public virtual Model Model 
    { 
    get { return _model; } 
    set 
    { 
    _model = value; 
    ModelId = _model.ID; 
    } 
    } 

    public virtual int ModelId { get; set; } 
} 

所以,現在我們可以直接

  1. 設置ModelId
  2. 設置基準以Model例如

兩種情況下ModelId都具有正確的值。

和NHibernate映射

<many-to-one name="Model" column="ModelId" insert="false" update="false" /> 
<property name="ModelId" column="ModelId/> 

好,唯一的永久性屬性是ModelId。但是,參考Model完全適用於篩選,導航......並且您可以僅使用int屬性發送您的Car實例...