0

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

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 行删除插入。我应用于 Request 对象的命令是session.Save(request);,仅此而已。

是否有任何理由调用删除?

编辑:

更新代码

 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

4

1 回答 1

0

我不同意您先前问题的公认答案;有关连接映射的说明,请参阅本文

我会将其建模为简单的多对多关系(如果 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);
        }
     }
}
于 2013-02-25T16:00:45.103 回答