[英]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
属性的值永远不会进入数据库。
单独保存Article
( session.Save(new Article(...));
)按预期工作,保存所有映射的属性。
总结一下:我想将ArticleMetadata
和Article
对象都添加到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.