2011-03-25 111 views
1

我想在我的应用程序中创建一对一的映射,我尝试了几个在Stackoverflow和其他地方找到的示例,但没有迄今为止成功。如何使用映射属性在NHibernate中创建一对一的映射

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

我的计划是把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参数,我期待自动删除预留。

有什么建议吗?

谢谢

+0

我不知道它是如何与属性的工作,但你可能需要设置'在订单预约财产逆= TRUE;。 – ChrisAnnODell 2011-03-25 14:09:36

+0

看起来你并没有'Order'和'Reservation'之间的1对1关系,而是多对一的关系,Chris说,你需要将其中的一个标记为'inverse = true'。 – R0MANARMY 2011-03-25 14:24:40

+0

ChrisAnnODell:我在Order类的Reservation属性中看不到inverse选项。 R0MANARMY os的地方建议像我一样使用ManyToOne,我发现问题,请参阅下面的答案。 – bcsanches 2011-03-26 02:39:00

回答

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” 参数。

谢谢