我升級到Nhibernate 3.2.0.4000和流利的1.3.0.717使用Nuget。當我嘗試保存時,曾經工作的映射現在引起了我的問題。數據加載正常,但是當我嘗試更改任何布爾值時,它們將被忽略。我可以保存文本字段沒有任何問題。實際上,我可以在一次保存中更改文本字段和布爾值,並且它實際上只是將文本字段更改保存到數據庫中。流利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因爲包含移動選項表中包含父ID,但父項不包含子表的列。數據庫中沒有FK關係,我無法使用HasOne工作。
這裏是在MobileOptions映射類映射
References<GatewayOptions>(x => x.Options, "OptionsId");
Component(x => x.SharedGatewayOptions, y =>
{
y.Map(x => x.GatewayActivated, "ActivateGateway").Generated.Insert();
});
當我創建一個新的記錄選項和移動服務,這一切工作正常,並設置了默認值。但是當我去改變激活布爾值(或任何其他布爾值)時,沒有錯誤,沒有任何東西被保存回數據庫。但是,在保存文本字段和布爾型字段時,在另一個子選項(很像MobileOptions
)中,只有文本字段會更改。
我改變了位代碼看起來像這樣
public void ToggleGateways(ToggleGatewaysRequest request)
{
var options = GetOptions(new GatewayOptionsRequest() { SiteId = request.SiteId });
options.RemoteGateway.SharedGatewayOptions.GatewayActivated = request.RemoteGatewayActivated;
optionsRepository.Save(options);
}
此代碼用來工作,但由於升級不工作了。我追蹤了它,並且內存中的對象正在更改,但隨後在下一個請求中,對象被「還原」。我已經瀏覽了代碼,看看下一個請求是否會導致位反轉,而事實並非如此。數據庫永遠不會被磨損。就好像最新的流暢程序不再知道如何在保存時映射布爾值 - >位。
在舊版流利/ NHibernate的時,'.Generated.Insert();'工作和字段將更新。我最終刪除了這部分映射,它像冠軍一樣工作。 – Josh 2012-05-03 19:10:58