2012-01-26 1 views
4

В настоящее время у меня возникает проблема при обновлении коллекции компонентов для объекта. Первоначально он был отображен как сумка, но это заставляло все записи удаляться и повторно вставляться каждый раз. Изменение его на набор исправило эту проблему, но ввело новую.NHibernate ошибочно по сравнению с нулевым при удалении компонента

Тип компонента называется Tracking, он имеет составной ключ UserID и ItemID и два свойства, которые являются нулевыми датами. Когда одно из них создано DateRead, установленное на текущее время, оно затем будет заменено записью с новой датой.

В основе SQL NHibernate генерируется предложение where, которое проверяет соответствие всех свойств.

Проблема есть другая дата DateAcknowledged часто нуль, и сгенерированный SQL, кажется, ошибка синтаксиса, чтобы сделать нулевой проверить это его делает: = NULL, а не: IS NULL, как показано на рисунке:

DELETE FROM TrackingTable 
    WHERE ItemId = 'a68f6dea-1c00-42e2-bc40-9fcf01121bd8' /* @p0 */ 
    AND UserId = 'c8aa41a4-e4c2-4347-ae6e-b48738a53b47' /* @p1 */ 
    AND DateRead = '2012-01-26T12:56:46.00' /* @p2 */ 
    AND DateAcknowledged = NULL /* @p3 */ 

Дело в том, что две даты не нужны вообще, чтобы определить, что нужно удалить. Просто наличие идентификатора идентификатора и идентификатора пользователя.

Вот код отображения, где я определяю набор:

Set(x => x.Trackings, 
     mapper => 
       { 
        mapper.Key(k => k.Column("ItemId")); 
        mapper.Table("Tracking"); 
        mapper.Access(Accessor.NoSetter); 
       }, 
       collectionMapping => collectionMapping.Component(TrackingMap.Mapping())); 

А вот отображение для компонента:

public class TrackingMap 
    { 
     public static Action<IComponentElementMapper<Tracking>> Mapping() 
     { 
      return c => 
      { 
       c.ManyToOne(x => x.User, a => { a.Column("UserId"); a.ForeignKey("UserId"); }); 
       c.Property(x => x.DateRead); 
       c.Property(x => x.DateAcknowledged, a => a.NotNullable(false)); 
      }; 
     } 
    } 

Есть ли способ сказать NHibernate использовать только ключи в предложении where или для сравнения правильных значений нулей?

+1

можно ли увидеть файл сопоставления? – nachojammers

+0

Возможно видеть hbm ?, для тех из нас, которые не используются для сопоставления по коду. – Dan

ответ

2

Это охватывается раздел 7.2. Collections of dependent objects, который отмечает, что это не поддерживается:

Пожалуйста, обратите внимание, что отображение композитных элементов не поддерживает нуль-состояние свойства, если вы с помощью < набора >. NHibernate должен использовать каждое значение столбца для идентификации записи при удалении объектов (в таблице составных элементов нет отдельного столбца первичного ключа), что невозможно с нулевыми значениями. Вы должны либо использовать только непустые свойства в составном элементе, либо выбрать < >, <map>, < Сумка > или <idbag>.

1

См. this answer для правильного объяснения того, как удалить объекты NHibernate с использованием критериев. Это должно позволить вам использовать только ItemId и UserId при определении элементов для удаления и безопасного игнорирования сопоставлений дат.

+0

Я на самом деле явно не удаляю запись, я просто добавляю и удаляю элементы из коллекции и вызывают обновление родительского элемента –

Смежные вопросы