NHibernate:单个延迟加载属性

时间:2013-07-03 14:59:41

标签: nhibernate fluent-nhibernate

更新:我现在确信问题在于Document配置为非懒惰。问题是我不控制基类,这意味着我无法将基础道具更改为虚拟......

阅读完文档之后,我假设我应该能够拥有一个非常惰性的懒惰属性类。这可能吗?这是我用来映射我的类的代码:

public class DocumentoMapping : ClassMap<Documento> {
public DocumentoMapping()
{
    Setup();
}

private void Setup()
{
    Table("Documentos");
    Not.LazyLoad();
    Id(doc => doc.Id, "IdDocumentos")
        .GeneratedBy.Identity()
        .Default(0);

    Map(doc => doc.NomeDocumento)
        .Not.Nullable();

    Map(doc => doc.Descricao);
    Map(doc => doc.Bytes, "Documento")
        .CustomSqlType("image")
        .CustomType<Byte[]>()
        .LazyLoad()
        .Length(2000000000);

    Component(doc => doc.Acao,
                accao =>
                {
                    accao.Map(a => a.Login);
                    accao.Map(a => a.Data);
                    accao.Map(a => a.UserAD)
                        .CustomSqlType("int")
                        .CustomType<ADs>();
                })
        .Not.LazyLoad();

    Map(doc => doc.IdPedidoAssistencia)
        .Column("IdPats")
        .Not.LazyLoad();
}
}

这是我班级的代码:

public class Documento : Entity, IHasAssignedId<int>{
public virtual Byte[] Bytes { get; private set; }

public Documento()
{
    NomeDocumento = Descricao = "";
    Acao = new Acao("none", DateTime.Now, ADs.Sranet);
}

public Documento(string nomeDocumento, string descricao, Acao acao)
{
    Contract.Requires(!String.IsNullOrEmpty(nomeDocumento));
    Contract.Requires(!String.IsNullOrEmpty(descricao));
    Contract.Requires(acao != null);
    Contract.Ensures(!String.IsNullOrEmpty(NomeDocumento));
    Contract.Ensures(!String.IsNullOrEmpty(Descricao));
    Contract.Ensures(Acao != null);
    NomeDocumento = nomeDocumento;
    Descricao = descricao;
    Acao = acao;
}
[DomainSignature]
public String NomeDocumento { get; private set; }
[DomainSignature]
public String Descricao { get; private set; }
[DomainSignature]
public Acao Acao { get; private set; }

internal Int32 IdPedidoAssistencia { get; set; }

internal static Documento CriaNovo(String nomeDocumento, String descricao, Byte[] bytes, Acao acao)
{
    Contract.Requires(!String.IsNullOrEmpty(nomeDocumento));
    Contract.Requires(!String.IsNullOrEmpty(descricao));
    Contract.Requires(bytes != null);
    Contract.Requires(acao != null);
    var documento = new Documento(nomeDocumento, descricao, acao) { Bytes = bytes };
    return documento;
}

public void ModificaBytes(Byte[] bytes)
{
    Contract.Requires(bytes != null);
    Bytes = bytes;
}

public void SetAssignedIdTo(int assignedId)
{
    Id = assignedId;
}

[ContractInvariantMethod]
private void Invariants()
{
    Contract.Invariant(NomeDocumento != null);
    Contract.Invariant(Descricao != null);
    Contract.Invariant(Acao != null);
}

}

基类只适用于基本内容,即设置Id和注入基本代码以进行实例比较。乍一看,我真的看不出这个代码有什么问题。我的意思是,该属性是虚拟的,映射表明它应该是虚拟的,那么为什么加载Get会强制完全加载属性呢?例如,这段代码:      var d = sess.Get(148);

结束生成sql以加载表上的所有属性。我弄错了吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,已经确认:为了在类上拥有延迟加载属性,该类也需要是懒惰的。