映射具体类型,通过代码使用nhibernate映射实现接口
本文关键字:映射 nhibernate 接口 实现 代码 类型 | 更新日期: 2023-09-27 17:59:46
我想通过代码使用nhibernate映射一对多集合
..
Bag(x => x.Articles,
c => { },
r => { r.OneToMany(); }
);
文章是IList<IArticle>
,假设我有实现IArticle的具体对象(MyArticle
和MyArticle2
)。
由于我得到了错误{"Association references unmapped class: MyApp.Model.IArticle"}
,我想我必须列出我想要映射的具体类型。
我该怎么做?
更新:为了提高清晰度,我将进一步描述文章类别。有
- I粒子(界面)
- ArticleBase(抽象类)
- 第十条
- 第Y条
文章。。。
公共抽象类ArticleBase:实体,IArticle{。。。}
public class ArticleX : ArticleBase { public IList<Image> Images {get; set;} ... } public class ArticleY : ArticleBase { public IList<Image> Images {get;set;} ... }
还有图像类。每一篇文章都有一袋图像,图像和文章有一对多的关系。
public class Image : Entity<Guid>
{
public virtual IArticle Article {get; set;}
}
**
更新2
public class Image : Entity<Guid>
{
public virtual ArticleBase Article { get; set; }
public Image() { }
}
**我使用下面建议的方法绘制了地图,比如这个
public class ArticleBaseMap : ClassMapping<ArticleBase>
{
public ArticleBaseMap()
{
Id(x => x.Id, m => m.Generator(Generators.GuidComb));
Discriminator(x =>
{
x.Column("discriminator");
});
}
}
public class MyArticleMap : SubclassMapping<MyArticle>
{
public MyArticle()
{
DiscriminatorValue("MyArticle");
}
}
public class ImageMap : ClassMapping<Image>
{
public ImageMap()
{
Id(x => x.Id, m => m.Generator(Generators.GuidComb));
ManyToOne(x => x.Article, m =>
{
m.NotNullable(true);
m.Class(typeof(ArticleBase));
});
}
}
我得到了System。TypeInitializationException,消息
{"Could not compile the mapping document: mapping_by_code"}
{"Cannot extend unmapped class: MyApp.Model.Article.MyArticle"}
这通常不会起作用。它只能在我们已经映射interface
(实际上充当抽象类)的情况下工作,例如:8.1.1。每个类层次结构的表,一个例子:
<class name="IArticle" table="Articles">
...
<discriminator column="Discriminator" />
<subclass name="Article1" discriminator-value="Article1">
...
代码继承映射:
public class ArticleBaseMap : ClassMapping<IArticle>
{
public ArticleBaseMap()
{
Discriminator(x =>
{
x.Column("discriminator");
子类:
public class Article1Map : SubclassMapping<Article1>
{
public Article1Map()
{
DiscriminatorValue("Article1");
...
这样的映射层次结构不应再抛出"Association references unmapped"。因此,在这种情况下的映射将需要引用的interface
或到的抽象/基类被映射-作为层次结构。
为了清楚起见,我建议映射抽象类,以避免混淆(IArticle
的任何实现都可以添加到该Bag
中)。事实上,我认为从Buisness域实体的角度映射接口没有任何好处。