2013-01-21 29 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实例...