不寻常的NHibernate集合/继承映射

不寻常的NHibernate集合/继承映射,nhibernate,nhibernate-collections,nhibernate-inheritance,Nhibernate,Nhibernate Collections,Nhibernate Inheritance,以下是我的相关课程: 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 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; }
}
目前,
SaveOrUpdate
退出时没有任何错误,但是一个完整的
文章
对象只能部分保存。也就是说,它的“
Content
属性的值永远不会进入数据库

单独保存
Article
session.Save(new Article(…);
)工作正常,保存所有映射属性


总而言之:我想将
articlemata
Article
对象添加到
Section.Articles
集合中,并希望它们被适当地保存。这种行为可能吗?

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

一种方法是使内容成为延迟加载的属性,并放弃继承

有关延迟加载属性的更多信息,请参见:


另一种方法是有两个集合,一个用于文章,另一个用于文章元数据。

我知道这并不能直接解决您的问题(我认为如果没有继承映射,您所做的工作将无法工作,然后您也会加载clob)

一种方法是使内容成为延迟加载的属性,并放弃继承

有关延迟加载属性的更多信息,请参见:


另一种方法是有两个集合,一个用于文章,另一个用于文章元数据。

我认为您需要显式地持久化文章对象,以便让它们工作。我假设cascade部分将它们视为ArticleMetadata,因此将它们存储为ArticleMetadata

否则,如果您不指定级联,而是在它们上使用session.Create(new Article()),那么刷新机制可能会为您解决这个问题。只有在没有显式地创建afaik对象时,级联才有用


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

我认为您需要显式地持久化文章对象,以便让它们工作。我假设cascade部分将它们视为ArticleMetadata,因此将它们存储为ArticleMetadata

否则,如果您不指定级联,而是在它们上使用session.Create(new Article()),那么刷新机制可能会为您解决这个问题。只有在没有显式地创建afaik对象时,级联才有用

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

<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>
var section = new Section();
section.Articles.Add(new ArticleMetadata("a1"));
section.Articles.Add(new Article("a2", "massive clob"));

session.SaveOrUpdate(section);