1

我升級到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); 
} 

此代碼用來工作,但由於升級不工作了。我追蹤了它,並且內存中的對象正在更改,但隨後在下一個請求中,對象被「還原」。我已經瀏覽了代碼,看看下一個請求是否會導致位反轉,而事實並非如此。數據庫永遠不會被磨損。就好像最新的流暢程序不再知道如何在保存時映射布爾值 - >位。

回答

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 2012-05-03 19:10:58

相關問題