我在我的数据库中存储了一些blob,所以我有一个Document表和一个DocumentContent表。文档包含文件名,描述等,并具有DocumentContent属性。防止nHibernate中的延迟加载
我有一个Silverlight客户端,所以我不想加载并将DocumentContent发送到客户端,除非我明确要求它,但是我在执行此操作时遇到问题。
我已阅读Davy Brion的博客文章。我已经尝试将lazy = false放置在我的配置中,并删除虚拟访问修饰符,但迄今为止还没有运气。
每次我做一个Session.Get(id)时,DocumentContent都是通过外部联接来检索的。我只希望这个属性在我明确地加入到这张表中并且要求时填充。
任何帮助表示赞赏。
我NHibernate的映射如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Jrm.Model"
namespace="Jrm.Model">
<class name="JrmDocument" lazy="false">
<id name="JrmDocumentID">
<generator class="native" />
</id>
<property name="FileName"/>
<property name="Description"/>
<many-to-one name="DocumentContent" class="JrmDocumentContent" unique="true" column="JrmDocumentContentID" lazy="false"/>
</class>
<class name="JrmDocumentContent" lazy="false">
<id name="JrmDocumentContentID">
<generator class="native" />
</id>
<property name="Content" type="BinaryBlob" lazy="false">
<column name="FileBytes" sql-type="varbinary(max)"/>
</property>
</class>
</hibernate-mapping>
和我的课是:
[DataContract]
public class JrmDocument : ModelBase
{
private int jrmDocumentID;
private JrmDocumentContent documentContent;
private long maxFileSize;
private string fileName;
private string description;
public JrmDocument()
{
}
public JrmDocument(string fileName, long maxFileSize)
{
DocumentContent = new JrmDocumentContent(File.ReadAllBytes(fileName));
FileName = new FileInfo(fileName).Name;
}
[DataMember]
public virtual int JrmDocumentID
{
get { return jrmDocumentID; }
set
{
jrmDocumentID = value;
OnPropertyChanged("JrmDocumentID");
}
}
[DataMember]
public JrmDocumentContent DocumentContent
{
get { return documentContent; }
set
{
documentContent = value;
OnPropertyChanged("DocumentContent");
}
}
[DataMember]
public virtual long MaxFileSize
{
get { return maxFileSize; }
set
{
maxFileSize = value;
OnPropertyChanged("MaxFileSize");
}
}
[DataMember]
public virtual string FileName
{
get { return fileName; }
set
{
fileName = value;
OnPropertyChanged("FileName");
}
}
[DataMember]
public virtual string Description
{
get { return description; }
set
{
description = value;
OnPropertyChanged("Description");
}
}
}
[DataContract]
public class JrmDocumentContent : ModelBase
{
private int jrmDocumentContentID;
private byte[] content;
public JrmDocumentContent()
{
}
public JrmDocumentContent(byte[] bytes)
{
Content = bytes;
}
[DataMember]
public int JrmDocumentContentID
{
get { return jrmDocumentContentID; }
set
{
jrmDocumentContentID = value;
OnPropertyChanged("JrmDocumentContentID");
}
}
[DataMember]
public byte[] Content
{
get { return content; }
set
{
content = value;
OnPropertyChanged("Content");
}
}
}
听起来像延迟加载正是你想要的 – UpTheCreek 2010-05-12 05:49:14
这不是我想要的。考虑UI体验。我将获得用户可能选择0+的文档列表。我不希望在我明确要求它的情况下才能检索DocumentContent - 如果用户甚至不打算使用它们,这将是一个巨大的性能拖动来加载所有DocumentContents。所以当用户点击文档时,我将有第二次服务调用来实际检索文档,包括DocumentContent – 2010-05-12 06:16:17
我不想延迟加载的原因是,我首先想要将文档列表发送到客户端,用户将选择这些文档之一,然后我将检索包含DocumentContent的文档以供他们保存。 因为我使用的是Silverlight,所以当Document被序列化时,DocumentContent会被触及,然后延迟加载。如果我关闭延迟加载,那么它会被热切地提取。我只是不想让它完全恢复 – 2010-05-12 06:22:12