不寻常的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);