2

更新:我现在确信问题在于 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。我弄错了吗?

谢谢!

4

1 回答 1

0

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

于 2013-07-04T07:41:24.350 回答