1

Nugetを使用してNhibernate3.2.0.4000とfluent1.3.0.717にアップグレードしました。以前は機能していたマッピングが、保存しようとしたときに問題を引き起こしています。データは正常に読み込まれますが、ブール値を変更しようとすると、それらは無視されます。テキストフィールドは問題なく保存できます。実際、1回の保存でテキストフィールドとブール値を変更できますが、実際にはテキストフィールドの変更のみがデータベースに保存されます。

まず、オプションオブジェクトがあります

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);
}

このコードは以前は機能していましたが、アップグレード以降は機能しなくなりました。トレースしたところ、オブジェクトはメモリ内で変更されていますが、次のリクエストで、オブジェクトは「元に戻されました」。私はコードをステップスルーして、次のリクエストでビットが反転する原因になっているのかどうかを確認しましたが、そうではありません。データベースは決してタフではありません。これは、最新の流暢な人が、保存時にブール値->ビットをマップする方法をもはや知らないかのようです。

4

1 に答える 1

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)...;
于 2012-05-03T08:21:17.283 に答える