2013-02-17 2 views
0

Это связано с этим вопросом, который я задал ранее.Почему каскад SaveUpdate запускает оператор Delete?

В Request картирование У меня установлено значение SaveUpdate должным образом и в Discount mapping У меня есть каскад, которого нет.

Есть два сценария:

  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);, ничего больше.

Будет ли причина, по которой выполняется вызов для удаления?

Edit:

код Обновление

public void Add(Request request) 
    { 

     using (ISession session = NHibernateHelper.OpenSession()) 
     { 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 
       session.Save(request); 
       transaction.Commit(); 
      } 
     } 
    } 

Скидка Mapping

<join table="DiscountRequests" optional="true"> 
    <key column="DiscountId" /> 
    <many-to-one name="Request" column="RequestId" cascade="none" /> 
</join> 

Запрос Mapping

<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

Вы обновили обе стороны отношений? Вы используете трюк с элементом с другого вопроса? Можете ли вы показать код, который выполняет изменения? –

+0

В зависимости от настроек 'Cascade' обновление« Скидки »может привести к удалению. У вас есть атрибут каскада в свойстве 'СкидкиRequests' класса' Скидки', установленном 'save, update'? Можете ли вы разместить файлы сопоставления для всех трех таблиц? – rae1

ответ

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); 
     } 
    } 
} 
Смежные вопросы