为什么级联保存更新会触发删除语句?

时间:2013-02-17 09:42:29

标签: nhibernate nhibernate-mapping nhibernate-cascade

这与我之前提出的这个问题有关。

Request映射中,我将其设置为SaveUpdate到期,在Discount映射中,我将级联设置为无。

有两种情况:

  1. 第一个是新请求和新折扣。创建两者然后为请求添加折扣并保存请求;这可以按预期工作。

  2. 下一个场景是新请求和现有折扣。这是行不通的,我不确定为什么。下面是测试中运行的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. 最后一行是问题:它将返回并从第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

1 个答案:

答案 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);
        }
     }
}