NHibernate:单个延迟加载属性

NHibernate:单个延迟加载属性,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,更新:我现在确信问题在于文档被配置为非惰性。问题是我不能控制基类,这意味着我不能将基本道具更改为虚拟道具 在阅读了文档之后,我假设我应该能够拥有一个具有lazy属性的非lazy类。这可能吗?下面是我用来映射类的代码: public class DocumentoMapping : ClassMap<Documento> { public DocumentoMapping() { Setup(); } private void Setup() { Table("Doc

更新:我现在确信问题在于文档被配置为非惰性。问题是我不能控制基类,这意味着我不能将基本道具更改为虚拟道具

在阅读了文档之后,我假设我应该能够拥有一个具有lazy属性的非lazy类。这可能吗?下面是我用来映射类的代码:

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(doc=>doc.Id,“IdDocumentos”)
.GeneratedBy.Identity()
.违约(0);
地图(doc=>doc.NomeDocumento)
.Not.Nullable();
映射(doc=>doc.descripcao);
映射(doc=>doc.Bytes,“Documento”)
.CustomSqlType(“图像”)
.CustomType()
.LazyLoad()
.长度(2000000000);
组件(doc=>doc.Acao,
accao=>
{
accao.Map(a=>a.Login);
accao.Map(a=>a.Data);
accao.Map(a=>a.UserAD)
.CustomSqlType(“int”)
.CustomType();
})
.Not.LazyLoad();
映射(doc=>doc.idpeddoassitencia)
.栏(“IdPats”)
.Not.LazyLoad();
}
}
下面是我的课程代码:

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

}
公共类文档o:Entity,IHasAssignedId{
公共虚拟字节[]字节{get;private set;}
公共文件
{
NomeDocumento=descripcao=“”;
Acao=新Acao(“无”,DateTime.Now,ADs.Sranet);
}
公共文档(字符串名称文档、字符串描述、Acao Acao)
{
Contract.Requires(!String.IsNullOrEmpty(nomeDocumento));
Contract.Requires(!String.IsNullOrEmpty(descripcao));
合同要求(acao!=null);
确保(!String.IsNullOrEmpty(NomeDocumento));
确保(!String.IsNullOrEmpty(descripcao));
合同(Acao!=null);
NomeDocumento=NomeDocumento;
descripcao=descripcao;
Acao=Acao;
}
[域名签名]
公共字符串NomeDocumento{get;private set;}
[域名签名]
公共字符串描述符{get;private set;}
[域名签名]
公共Acao Acao{get;私有集;}
内部Int32 IDPEDIDOASSITENCIA{get;set;}
内部静态Documento CriaNovo(字符串nomeDocumento,字符串描述符,字节[]字节,Acao Acao)
{
Contract.Requires(!String.IsNullOrEmpty(nomeDocumento));
Contract.Requires(!String.IsNullOrEmpty(descripcao));
Contract.Requires(字节!=null);
合同要求(acao!=null);
var documento=new documento(nomeDocumento,descripao,acao){Bytes=Bytes};
返回文件o;
}
公共无效修改字节(字节[]字节)
{
Contract.Requires(字节!=null);
字节=字节;
}
公共void SetAssignedIdTo(int assignedId)
{
Id=assignedId;
}
[收缩变量法]
私有void不变量()
{
Contract.Invariant(NomeDocumento!=null);
Contract.Invariant(descripao!=null);
Contract.Invariant(Acao!=null);
}
}
基类只是用于基本的东西,即设置Id和注入用于实例比较的基类代码。乍一看,我看不出这段代码有什么问题。我的意思是,属性是虚拟的,映射说它应该是虚拟的,那么为什么用Get加载它会强制加载完整的属性呢?例如,此代码: var d=sess.Get(148)

最终生成sql以加载表上的所有属性。我弄错了吗


谢谢

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

我还没有检查是否仍然是这种情况,因此我不会将其作为答案发布,但根据以下来源,如果您想在实体上具有惰性属性,那么您的实体也必须是惰性的:是的,就是这样。我昨天确认了我的假设,但没有在这里发布我的结论。谢谢