Fluent nhibernate Fluent nHibernate-保存一些接口,而不是其他接口
我在流利的英语中遇到了一个奇怪的错误。我有一组从接口继承的基本类,我将接口映射到表,在类使用这些类的地方,它们实现了接口的泛型。它们的定义如下:Fluent nhibernate Fluent nHibernate-保存一些接口,而不是其他接口,fluent-nhibernate,Fluent Nhibernate,我在流利的英语中遇到了一个奇怪的错误。我有一组从接口继承的基本类,我将接口映射到表,在类使用这些类的地方,它们实现了接口的泛型。它们的定义如下: interface IPage { // properties } class IPageMap : ClassMap<IPage> { // mapping information } class Page : IPage { // IPage Implementation } class ITag { // prope
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; }
}
接口IPage{
//性质
}
类IPageMap:ClassMap{
//地图信息
}
类页:IPage{
//IPage实现
}
ITag类{
//性质
}
类ITagMap:类映射{
//地图信息
}
类别标签:ITag{
//ITag实施
}
类模板{
虚拟IList页{get;set;}
虚拟IList标记{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 {
// ..
}
}
}
}
var pages=新列表{
新页{
// ..
}
}
pages.ForEach(x=>{session.SaveOrUpdate(x);});//这里也不例外
var tags=新列表{
新标签{
// ...
}
}
tags.ForEach(x=>{session.SaveOrUpdate(x);});//这里有例外。
变量列表=新列表{
新模板{
页面=新列表{
新网页{
// ...
}
},
标签=新列表{
新标签{
// ..
}
}
}
}
我有以下例外情况
没有标记的持久化程序
好的,我没有为Tag
定义一个持久器,但是我为ITag
定义了持久器,并且Tag
继承了它<代码>IPage和页面
的工作方式相同。如果我注释掉标签信息,只留下IPage
和页面
实现,那么对这些标签来说效果很好
为什么
ITag
和Tag
受到不同的对待?有什么想法吗?您需要将标记映射为ITag
的子类。每个持久性类型都需要单独映射,您需要告诉NH子类的成员将要到哪里(即使没有),更重要的是,当从数据库读取数据时,NH应该实例化哪个具体类型。好的,那很好-但是为什么我不必对页面
执行此操作呢?我没有把它映射为一个子类,它仍然有效。我看不出有什么不同,就像你在这里告诉我的那样。其他地方肯定有不同。是的,因此我完全困惑了。e、 eb但删除“其他所有内容”后,您无法找到差异。你的问题实际上是:“我有两个相同的情况。有什么区别?”我怎么知道?我已经解决了这个问题。关于地图绘制,你是对的。下面是发生的事情。当我创建新的IPage
元素时,它们将位于另一个对象的集合中。这意味着在该对象的映射图中指定了特定的关系映射。但是,如果我尝试创建一个IPage
独立版,它将失败。我只是简单地假设,因为在ITag
列表之前我没有任何故障,IPage
的工作方式是相同的。