如何使用Mapping Attributes在NHibernate中创建一对一映射

时间:2011-03-25 02:21:02

标签: c# nhibernate nhibernate-mapping

我正在尝试在我的应用程序中创建一对一映射,我尝试了几个我在Stackoverflow和其他地方找到的样本,但到目前为止没有成功。

我有一个Order类和一个预订类。可以在没有预订的情况下存在多个订单,但预订始终必须有订单。

我的计划是将FK放在预订表中,代码如下:

  class Order
  {
     ... 
     [OneToOne(Cascade = "all-delete-orphan")]        
     public Reservation Reservation
     {
        get;
        private set;
     }
  }

课程预订:

 class Reservation
 {
    ...
    [ManyToOne(Column = "order_id", NotNull=true, Unique=true)]        
    public Order Order
    {
        get;
        set;
    }
 }

这很好用,但是当我尝试删除订单时:

session.Delete(myOrder);
session.FlushSession();

由于保留FK为空,我得到了FK违规异常,但由于Cascade参数,我预计会自动删除保留。

有什么建议吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了问题:当一个订单被加载时,它试图使用像“WHERE order.id = revervation.id”这样的子句来查找预订,但实际上它需要检查预订表中的FK:“ WHERE order.id = reservation.order_id“

因此,保留从未正确加载,并且当删除订单时,没有删除任何保留,结果是订单已从数据库中删除,并且在发出刷新时,由于保留而违反了FK约束还在那里。

要解决此问题,我将订单代码更改为:

[OneToOne(Cascade="all-delete-orphan", ForeignKey="none", PropertyRef="Order", Lazy=Laziness.Proxy)]        
    public Reservation Reservation
    {
        get;
        private set;
    }

请注意“PropertyRef”参数。

谢谢