0

関連するクラスは次のとおりです。

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オブジェクトのみを含めるようにします。しかし、DB に保存するときは、NHibernate にオブジェクトもSection永続化してもらいたい: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プロパティの値が DB に到達することはありません。

Article個別に保存( session.Save(new Article(...));) すると期待どおりに機能し、マップされたすべてのプロパティが保存されます。

要約すると、ArticleMetadataArticleオブジェクトの両方をSection.Articlesコレクションに追加し、それらを適切に保存したいと考えています。この種の動作はまったく可能ですか?

4

2 に答える 2

3

私はそれがあなたの問題の直接的な解決策ではないことを知っています(あなたがしていることは継承マッピングなしではうまくいかないと思います、そしてあなたはclobもロードします)。

必要と思われることを行う1つの方法は、Contentを遅延ロードされたプロパティにして、継承を削除することです。

遅延ロードされたプロパティの詳細については、http://ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspxを参照してください。

もう1つの方法は、Articles用とArticleMetadata用の2つのコレクションを用意することです。

于 2010-08-03T11:37:10.923 に答える
0

Article-objects を機能させるには、それらを明示的に永続化する必要があると思います。Section-cascade はそれらを ArticleMetadata として扱い、そのように保存すると仮定します。

それ以外の場合、カスケードを指定せず、代わりに session.Create(new Article()) を使用すると、おそらくフラッシュメカニズムがそれを処理します。カスケードは、オブジェクトを明示的に作成しない場合にのみ役立ちます。

ただし、1つのポインター。ArticleMetadata を選択したときに完全な記事を読み込まないようにするには、ArticleMetadata のクラス マッピングで polymorphism="explicit" を指定する必要があります。そうしないと、継承が識別され、毎回別のクエリで記事が選択されます。

于 2010-08-03T12:40:07.020 に答える