1

Я обновился до 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 -> бит при сохранении.

ответ

1

AFAIK .Generated.Insert(); означает, что это свойство создается при вставке, а затем не изменяется, но поскольку вы хотите его изменить, вы должны его оставить.

не является прямым ответом на ваш вопрос, но вы считаете, что присоединились к другой таблице, чтобы получить желаемые значения?

public class Options 
{ 
    public virtual long OptionsId { get; set; } 

    public virtual MobileOptions MobileGateway { get; set; } 
} 

// in OptionsMap 
Join("MobileOptions", join => 
{ 
    join.Optional(); 
    join.KeyColumn("OptionsId"); 
    join.Component(x => x.SharedGatewayOptions, y => 
    { 
     y.Map(x => x.GatewayActivated, "ActivateGateway"); 
    }); 
}); 

или альтернативный класс дизайн

public class GatewayOptions 
{ 
    public virtual bool GatewayActivated { get; set; } 
} 

public class MobileOptions : GatewayOptions 
{ 
    public virtual bool Something { get; set; } 
} 

// in OptionsMap 
RefernecesAny(x => x.Options)...; 
+0

В предыдущей версии беглом/NHibernate, то '.Generated.Insert();' работали и поля будут обновляться. Я закончил удаление этой части карты, и она работала как чемпион. – Josh