NHibernate:单个延迟加载属性
更新:我现在确信问题在于文档被配置为非惰性。问题是我不能控制基类,这意味着我不能将基本道具更改为虚拟道具 在阅读了文档之后,我假设我应该能够拥有一个具有lazy属性的非lazy类。这可能吗?下面是我用来映射类的代码:NHibernate:单个延迟加载属性,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,更新:我现在确信问题在于文档被配置为非惰性。问题是我不能控制基类,这意味着我不能将基本道具更改为虚拟道具 在阅读了文档之后,我假设我应该能够拥有一个具有lazy属性的非lazy类。这可能吗?下面是我用来映射类的代码: public class DocumentoMapping : ClassMap<Documento> { public DocumentoMapping() { Setup(); } private void Setup() { Table("Doc
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以加载表上的所有属性。我弄错了吗
谢谢 是的,已经确认:为了在类上具有惰性加载属性,该类也需要是惰性的。我还没有检查是否仍然是这种情况,因此我不会将其作为答案发布,但根据以下来源,如果您想在实体上具有惰性属性,那么您的实体也必须是惰性的:是的,就是这样。我昨天确认了我的假设,但没有在这里发布我的结论。谢谢