0

一連の列でエンティティを定義し、マッピングを作成しました。

public class PurchaseRecord {
    public virtual int? Id {
        get;
        set;
    }

    public virtual DateTime? PurchasedDate {
        get;
        set;
    }

    public virtual string Comment {
        get;
        set;
    }

    public virtual IList<PurchaseRecordExtendedProperty> ExtendedPropertyValues {
        get;
        set;
    }

public class PurchaseRecordMap : ClassMap<PurchaseRecord> {
    public PurchaseRecordMap() {
        Table("PurchaseRecords");

        Id(x => x.Id, "RecordID").GeneratedBy.Identity();

        Map(x => x.PurchasedDate, "PurchaseDate").Not.Nullable();
        Map(x => x.Comment, "Comment");

        HasMany(x => x.ExtendedPropertyValues).KeyColumn("ExtendedPropertyID").Cascade.All();
    }

ほとんどの場合はうまく機能しますが、特定の状況では、特定の列 (子コレクションなどExtendedPropertyValues) の更新をスキップしたい場合があります。オブジェクトを作成するとき、PurchaseRecordわざわざ のデータをロードすることさえしませんExtendedPropertyValues。しかし、プロパティが null の場合、NHibernate はデータベースから子レコードを削除しようとします。

ExtendedPropertyValues決して変更されないシナリオがあることは知っています。パフォーマンスを考慮して、必要のないデータをロードしたくありません。更新する必要がない場合、指定されたプロパティを NH に強制的にスキップさせる方法はありますか?

提案をありがとう。

4

1 に答える 1

0

遅延ロードを有効にすると、NHibernate は子コレクションをロードしようとせず、アクセスした場合にのみロードするプロキシに初期化されます。子コレクションを null に設定すると、事実上、NHibernate にその関係のすべてのエントリを削除するように指示されます (関係を逆としてマークしない限り)。

NHibernate は、子コレクションが変更されない限り、子コレクションを更新しようとはしません (null に設定することで可能です)。

要約すると、遅延読み込みを有効にし、ExtendedPropertyValues を逆としてマークします。ExtendedPropertyValues を変更しない限り更新しないでください。アクセスしない限り、ExtendedPropertyValues も読み込まれません。

于 2012-10-25T10:18:29.430 に答える