В настоящее время у меня возникает проблема при обновлении коллекции компонентов для объекта. Первоначально он был отображен как сумка, но это заставляло все записи удаляться и повторно вставляться каждый раз. Изменение его на набор исправило эту проблему, но ввело новую.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 или для сравнения правильных значений нулей?
можно ли увидеть файл сопоставления? – nachojammers
Возможно видеть hbm ?, для тех из нас, которые не используются для сопоставления по коду. – Dan