2011-03-25 40 views
0

我遇到了流利的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被区别对待?有任何想法吗?

回答

2

您需要将Tag作为ITag的子类别映射。每个持久化类型需要单独映射,您需要告诉NH子类的成员将要去哪里(即使没有任何),更重要的是当从数据库中读取数据时,哪些具体类型NH应该实例化。

+0

好的,这很好 - 但为什么我不必用'Page'来做?我没有把它映射成一个sublcass,它仍然有效。 – Ciel 2011-03-25 14:18:04

+1

我看不出它在这里告诉我的任何区别。其他地方一定有区别。 – 2011-03-25 14:20:05

+0

是的,因此我完全混淆。 e.e – Ciel 2011-03-25 14:34:51