繁体   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