[英]Unusual NHibernate collection/inheritance mapping
這是我的相關課程:
public class ArticleMetadata
{
public long ID { get; set; }
public string Slug { get; set; }
}
public class Article : ArticleMetadata
{
// This is a massive CLOB, hence separate class
public string Content { get; set; }
}
public class Section
{
public long ID { get; set; }
public IList<ArticleMetadata> Articles { get; set; }
}
這里是相關的映射部分:
<class name="Article" table="Article">
</class>
<!-- Note that there's no explicit NHibernate inheritance mapping here -->
<class name="ArticleMetadata" table="Article">
</class>
<class name="Section" table="Section">
<bag name="Articles" cascade="all-delete-orphan" inverse="true" lazy="false">
<key column="SectionID" />
<one-to-many class="ArticleMetadata" />
</bag>
</class>
希望到現在為止一切都已清除。
我想做的事情如下:在選擇我的Section
對象時,我希望它們僅包含“輕量級” ArticleMetadata
對象。 但是,當將Section
保存到數據庫時,我希望NHibernate也持久保存Article
對象:
var section = new Section();
section.Articles.Add(new ArticleMetadata("a1"));
section.Articles.Add(new Article("a2", "massive clob"));
session.SaveOrUpdate(section);
當前, SaveOrUpdate
退出沒有任何錯誤,但是一個成熟的Article
對象僅被部分保存。 也就是說,其Content
屬性的值永遠不會進入數據庫。
單獨保存Article
( session.Save(new Article(...));
)按預期工作,保存所有映射的屬性。
總結一下:我想將ArticleMetadata
和Article
對象都添加到Section.Articles
集合中,並希望將它們適當地保存。 這種行為有可能嗎?
我知道這不是直接解決您的問題的方法(我認為如果沒有繼承映射,您正在做的事情就無法工作,然后您也加載了Clob)。
一種執行您想要的操作的方法是使Content成為延遲加載的屬性,並刪除繼承。
有關延遲加載的屬性的更多信息,請參見: http : //ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspx
另一種方法是擁有兩個集合,一個用於Articles,一個用於ArticleMetadata。
我認為您將需要明確地保留Article-objects才能使其正常工作。 我假設Section-cascade將它們視為ArticleMetadata,因此將其存儲為此類。
否則,如果您不指定級聯,而是在其上使用session.Create(new Article()),則刷新機制可能會為您處理。 僅當您未顯式創建對象afaik時,級聯才有用。
雖然一個指針。 為了在選擇ArticleMetadata時不加載完整的Article,您必須在ArticleMetadata的類映射上指定polymorphism =“ explicit”,否則它將識別繼承並每次在單獨的查詢中選擇Article。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.