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
的工作方式是相同的。