업데이트 : 이제 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 생성을 종료합니다. 내가 잘못 했니?
감사합니다.
아직 답장을 보내지 않았지만 답장으로 게시하지는 않지만 다음 소스에 따르면 엔티티에 게으른 속성을 원할 경우 엔티티도 게으른 것이어야합니다. http://weblogs.asp.net/ricardoperes/archive/2011/05/29/nhibernate-pitfalls-lazy-properties-in-non-lazy-entities.aspx – cremor
예, 그렇습니다. 나는 어제 내 가정을 확인했지만 여기에 내 결론을 게시하지 않았다. 감사 –