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

它在大多数情况下都很好用,但是在某些情况下我想跳过更新某些列(例如 child collection ExtendedPropertyValues)。当我创建PurchaseRecord对象时,我什至懒得加载ExtendedPropertyValues. 但是如果属性为空,NHibernate 会尝试从数据库中删除子记录。

我知道有些情况ExtendedPropertyValues永远不会改变。出于性能考虑,我不想加载我不需要的数据,如果我不需要更新,有没有办法强制 NH 跳过指定的属性?

感谢您的任何建议。

4

1 回答 1

0

如果启用延迟加载,NHibernate 将不会尝试加载任何子集合,它们将被初始化为代理,只有在您访问它们时才会加载它们。如果您将子集合设置为 null,这实际上是在告诉 NHibernate 删除该关系中的所有条目(除非您将关系标记为反向)。

NHibernate 不会尝试更新子集合,除非它们发生变化(将其设置为 null 就可以了)。

总之,启用延迟加载,并将 ExtendedPropertyValues 标记为反向,除非您更改 ExtendedPropertyValues,否则它不应更新它,除非您访问它,否则它也不会加载 ExtendedPropertyValues。

于 2012-10-25T10:18:29.430 回答