簡體   English   中英

異常的NHibernate集合/繼承映射

[英]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屬性的值永遠不會進入數據庫。

單獨保存Articlesession.Save(new Article(...)); )按預期工作,保存所有映射的屬性。

總結一下:我想將ArticleMetadataArticle對象都添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM