流畅的nHibernate - 保存一些接口,而不是其他接口

时间:2011-03-25 13:57:10

标签: fluent-nhibernate

我在流利的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继承了它。 IPagePage的工作方式相同。如果我注释掉标记信息并离开IPagePage实现,那么它适用于那些。

为什么ITagTag被区别对待?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您需要将Tag映射为ITag的子类。每个持久化类型都需要单独映射,你需要告诉NH子类成员的位置(即使没有),更重要的是NH在从数据库中读取数据时应该实例化的具体类型。 / p>