2013-02-17 70 views
0

这与我之前询问过的这个问题有关。为什么级联SaveUpdate会触发Delete语句?

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行我申请的请求命令删除插件对象是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 -太ne-relationship-nhibernate-mapping

+1

你有关系的双方更新?你是否在使用另一个问题中的元素的技巧?你能显示执行更改的代码吗? – 2013-02-17 11:28:50

+0

根据您的“Cascade”设置,更新“Discounts”可能会导致删除。您在“Discounts”类的“DiscountsRequests”属性中设置了级联属性,设置为“保存,更新”?你能发布所有三张表的映射文件吗? – rae1 2013-02-19 05:15:04

回答

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); 
     } 
    } 
} 
相关问题