通过id在NHibernate会话中初始化对象

时间:2013-01-21 13:36:14

标签: c# 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; }

}

例如实体模型(在Car中)已经包含在数据库中并且用于保存Order应该足够只是Model ID但是现在它从Client发送到所有实体Car和具有所有属性的模型。如果我只发送实体ID(我的意思是那个已经在数据库中并且有私钥的实体),我可以保存订单吗?

1 个答案:

答案 0 :(得分: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 instance
  3. 在两种情况下ModelId都有正确的值。

    和NHibernate映射

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

    嗯,唯一持久的属性是ModelId。但是,引用Model完全适用于过滤,导航...而且您只能使用int属性发送Car实例...