我在流利的nhibernate中遇到了一个奇怪的错误。我有一组从接口继承的基本类,我已经将接口映射到表,并且类利用这些类,它们实现了接口的通用。它们的定义如下;
interface IPage {
// properties
}
class IPageMap : ClassMap<IPage> {
// mapping information
}
class Page : IPage {
// IPage Implementation
}
class ITag {
// properties
}
class ITagMap : ClassMap<ITag> {
// mapping information
}
class Tag : ITag {
// ITag implementation
}
class Template {
virtual IList<IPage> Pages { get; set; }
virtual IList<ITag> Tags { get; set; }
}
这应该可以正常工作。当我创建这样的对象时......
var pages = new List<IPage> {
new Page {
// ..
}
}
pages.ForEach( x => { session.SaveOrUpdate(x); } ); // no exception here
var tags = new List<ITag> {
new Tag {
// ...
}
}
tags.ForEach( x => { session.SaveOrUpdate(x); } ); // exception happens here.
var list = new List<Template> {
new Template {
Pages = new List<IPage> {
new Page {
// ...
}
},
Tags = new List<ITag> {
new Tag {
// ..
}
}
}
}
我遇到以下例外情况。
没有持久性
Tag
好的,我没有为Tag
定义一个容器,但我为ITag
做了一个,Tag
继承了它。 IPage
和Page
的工作方式相同。如果我注释掉标记信息并离开IPage
和Page
实现,那么它适用于那些。
为什么ITag
和Tag
被区别对待?有什么想法吗?
答案 0 :(得分:2)
您需要将Tag
映射为ITag
的子类。每个持久化类型都需要单独映射,你需要告诉NH子类成员的位置(即使没有),更重要的是NH在从数据库中读取数据时应该实例化的具体类型。 / p>