我在我的數據庫中存儲了一些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