Я обновился до Nhibernate 3.2.0.4000 и свободно 1.3.0.717 с помощью Nuget. Сопоставления, которые раньше работали, теперь вызывают у меня проблему, когда я пытаюсь сохранить. Данные загружаются отлично, но когда я пытаюсь изменить любые логические значения, они игнорируются. Я могу сохранить текстовые поля без каких-либо проблем. Фактически, я могу изменить текстовое поле и логическое значение в одном сохранении, и это только фактически сохраняет изменение текстового поля в базе данных.Fluent Nhibernate не будет сохранять булевы в hasmany
Во-первых, у меня есть варианты объекта
public class Options
{
public virtual long OptionsId { get; set; }
private IList<MobileOptions> MobileGatewayList { get; set; }
public virtual MobileOptions MobileGateway
{
get
{
if (MobileGatewayList == null)
return null;
return MobileGatewayList.FirstOrDefault();
}
}
}
И для мобильных конкретных вариантов у меня есть класс
public class MobileOptions
{
public virtual long MobileOptionsId { get; set; }
public virtual Options Options { get; set; }
public virtual SharedGatewayOptions SharedGatewayOptions { get; set; }
}
SharedGatewayOptions
является классом общих опций для всех моих подмножеств вариантов (у меня есть 3, но я показываю только мобильный, чтобы этот пример был кратким). В частности, когда я заметил, что ошибка была в булевом флаге, чтобы включить мобильную часть моего приложения.
public class SharedGatewayOptions
{
public virtual bool GatewayActivated { get; set; }
}
Отображение мобильных вариантов в моей основных настройках карты вариантов класса выглядит следующим образом
HasMany<MobileOptions>(Reveal.Member<GatewayOptions>("MobileGatewayList"))
.KeyColumn("OptionsId")
.Cascade.All();
мне пришлось использовать hasmany, так как таблица, содержащая мобильные опции содержит идентификатор родительского, но parent не содержит столбец дочерней таблицы. В базе данных нет отношений FK, и я не мог заставить HasOne работать.
Вот отображение в MobileOptions classmap
References<GatewayOptions>(x => x.Options, "OptionsId");
Component(x => x.SharedGatewayOptions, y =>
{
y.Map(x => x.GatewayActivated, "ActivateGateway").Generated.Insert();
});
Когда я создаю новые опции записи и мобильные варианты, все это прекрасно работает и настроен с параметрами по умолчанию. Но когда я перехожу к изменению логической функции boolean (или любого другого логического), ошибки нет и ничего не сохраняется в базе данных. Тем не менее, в других дочерних вариантах (подобно MobileOptions
), когда я сохраняю текстовое поле и логическое поле, изменяется только текстовое поле.
Мой код для изменения бита выглядит следующим образом
public void ToggleGateways(ToggleGatewaysRequest request)
{
var options = GetOptions(new GatewayOptionsRequest() { SiteId = request.SiteId });
options.RemoteGateway.SharedGatewayOptions.GatewayActivated = request.RemoteGatewayActivated;
optionsRepository.Save(options);
}
Этот код используется для работы, но так как обновление он больше не работает. Я проследил его, и объект изменяется в памяти, но затем при следующем запросе объект «возвращается». Я перешагнул код, чтобы увидеть, если на следующем запросе я каким-то образом заставляю бит откидываться назад, и это не так. База данных никогда не отгружается. Это как если бы новейшие тексты уже не знали, как сопоставить boolean -> бит при сохранении.
В предыдущей версии беглом/NHibernate, то '.Generated.Insert();' работали и поля будут обновляться. Я закончил удаление этой части карты, и она работала как чемпион. – Josh