这与我之前提出的这个问题有关。
在Request
映射中,我将其设置为SaveUpdate
到期,在Discount
映射中,我将级联设置为无。
有两种情况:
第一个是新请求和新折扣。创建两者然后为请求添加折扣并保存请求;这可以按预期工作。
下一个场景是新请求和现有折扣。这是行不通的,我不确定为什么。下面是测试中运行的SQL语句(省略值):
NHibernate: INSERT INTO Requests
NHibernate: SELECT @@identity
NHibernate: INSERT INTO DiscountRequests (DiscountId, RequestId) VALUES (3, 5);
NHibernate: UPDATE Discounts
NHibernate: DELETE FROM DiscountRequests WHERE DiscountId = 3;
最后一行是问题:它将返回并从第3行删除插入。我正在申请Request对象的命令是session.Save(request);
,没有别的。
是否有任何理由可以调用Delete?
编辑:
更新代码
public void Add(Request request)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(request);
transaction.Commit();
}
}
}
折扣映射
<join table="DiscountRequests" optional="true">
<key column="DiscountId" />
<many-to-one name="Request" column="RequestId" cascade="none" />
</join>
请求映射
<join table="DiscountRequests" optional="true">
<key column="RequestId" />
<many-to-one name="Discount" column="DiscountId" cascade="save-update" />
</join>
TTP://stackoverflow.com/questions/14837373/zero-to-one-relationship-nhibernate-mapping
答案 0 :(得分:0)
我不同意你earlier question的接受答案;有关联接映射的说明,请参阅this article。
我会将其建模为一个简单的多对多关系(如果DiscountRequest有额外的数据,则将其设为两个一对一)。您可以将集合映射为字段,并通过公共属性强制执行折扣具有0或1请求(反之亦然)的规则。如果它是多对多,则级联设置应为none
。
例如:
public class Request
{
private ICollection<Discount> _discounts;
public Request() { _discounts = new Hashset<Discount>(); }
public Discount
{
get { return _discounts.SingleOrDefault(); }
set
{
_discounts.Clear();
if (value != null) { _discounts.Add(value);
}
}
}