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对象。但是当保存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(...));) 按预期工作,保存所有映射的属性。

总结一下:我想将ArticleMetadataArticle对象都添加到Section.Articles集合中,并希望它们被适当地保存。这种行为完全可能吗?

4

2 回答 2

3

我知道这不是您问题的直接解决方案(我认为如果没有继承映射,您正在做的事情就无法工作,然后您也加载了 clob)。

一种执行您想要的方法的方法是使 Content 成为延迟加载的属性,并删除继承。

更多关于延迟加载的属性可以在这里找到:http: //ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspx

另一种方法是有两个集合,一个用于 Articles,一个用于 ArticleMetadata。

于 2010-08-03T11:37:10.923 回答
0

我认为您需要明确地保留 Article-objects 才能使它们工作。我假设 Section-cascade 将它们视为 ArticleMetadata 并因此存储它们。

否则,如果您没有指定级联,而是在它们上使用 session.Create(new Article()) ,那么刷新机制可能会为您处理它。仅当您没有明确创建对象 afaik 时,级联才有用。

一个指针。为了在您选择 ArticleMetadata 时不加载完整的文章,您必须在 ArticleMetadata 上的类映射中指定 polymorphism="explicit",否则它将识别继承并每次在单独的查询中选择您的文章。

于 2010-08-03T12:40:07.020 回答