1

Nugetを使用してNhibernate 3.2.0.4000にアップグレードし、流暢に1.3.0.717にアップグレードしました。今まで働いていたマッピングが、私が保存しようとすると問題を引き起こしています。データは正常に読み込まれますが、ブール値を変更しようとすると無視されます。テキストフィールドを問題なく保存できます。実際、1回の保存でテキストフィールドとブール値を変更できます。実際には、テキストフィールドの変更をデータベースに保存するだけです。流暢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(); 

のように見える私はモバイルオプションを含むテーブルは、親IDが含まれているため、hasManyのを使用する必要がありましたが、親には子テーブルへの列が含まれていません。データベースに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); 
} 

動作するが、アップグレードするので、それはもう動作しません使用このコードのように見えます。私はそれを追跡し、オブジェクトはメモリ内で変更されていますが、次の要求では、オブジェクトは「復帰」します。私は、次のリクエストで何らかの理由でビットが元に戻ってくるかどうかを確認するためにコードをステップ実行しましたが、そうではありません。データベースは決して傷つけられない。これは、最新の流暢なものがもはや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"); 
    }); 
}); 

または代替クラスが設計流暢/ NHibernateは、以前のバージョンで

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

、 '.Generated.Insertは();'働き、フィールドが更新だろう。私はマッピングのこの部分を削除して終了し、それはチャンピオンのように働いた。 – Josh