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
定义持久化器,但我为 ITag
和 Tag 定义了持久化器
继承它。 IPage
和 Page
的工作方式相同。如果我注释掉标签信息并只保留 IPage
和 Page
实现,那么它对于这些信息来说效果很好。
为什么 ITag
和 Tag
的处理方式不同?有什么想法吗?
I've run into a strange error in fluent nhibernate. I have a basic set of classes that inherit from interfaces, and I have mapped the interfaces to tables, and where classes utilize these, they implement a generic of the interface. They are defined as follows;
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; }
}
This should work fine. When I create an object like this ...
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 {
// ..
}
}
}
}
I am given the following exception.
There is no persister for
Tag
Okay, I didn't define a persister for Tag
, but I did for ITag
, and Tag
inherits it. IPage
and Page
work the same way. If I comment out the tag information and just leave the IPage
and Page
implementation, it works fine for those.
Why is ITag
and Tag
being treated differently? Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要将
Tag
映射为ITag
的子类。每个持久类型都需要单独映射,您需要告诉 NH 子类的成员要去哪里(即使没有),更重要的是,当从数据库读取数据时,NH 应该实例化哪个具体类型。You need to map
Tag
as a subclass ofITag
. Every persistent type needs to be mapped separately, you need to tell NH where the members of the subclass are going to (even if there aren't any) and more importantly which concrete type NH should instantiate when reading the data from the database.