2013-07-03 1 views
1

업데이트 : 이제 Document가 non-lazy로 설정되었다는 사실에 문제가 있다는 것을 확신합니다. 문제는 내가 기본 클래스를 제어하지 않는다는 것입니다. 즉, 기본 소품을 가상으로 변경할 수 없다는 것을 의미합니다.NHibernate : 단일 지연로드 속성

문서를 읽은 후, 내가 가질 수 있어야한다는 가정하에 있습니다. 게으른 속성을 지닌 비 게으른 클래스. 이것이 가능한가? 여기에 내가 내 클래스 매핑을 위해 사용하고 코드입니다 :

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

아직 답장을 보내지 않았지만 답장으로 게시하지는 않지만 다음 소스에 따르면 엔티티에 게으른 속성을 원할 경우 엔티티도 게으른 것이어야합니다. http://weblogs.asp.net/ricardoperes/archive/2011/05/29/nhibernate-pitfalls-lazy-properties-in-non-lazy-entities.aspx – cremor

+0

예, 그렇습니다. 나는 어제 내 가정을 확인했지만 여기에 내 결론을 게시하지 않았다. 감사 –

답변

0

예, 확인되었습니다. 클래스에 지연로드 속성이 포함되도록하려면 클래스도 지연되어야합니다.