我正在尝试在我的应用程序中创建一对一映射,我尝试了几个我在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参数,我预计会自动删除保留。
有什么建议吗?
谢谢
答案 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”参数。
谢谢