我想使用代码
的nhibernate映射一个到多个集合..
Bag(x => x.Articles,
c => { },
r => { r.OneToMany(); }
);
文章是IList<IArticle>
,我们可以说我有实现IArticle的具体对象(MyArticle
和MyArticle2
)。
由于我收到错误{"Association references unmapped class: MyApp.Model.IArticle"}
,我想我必须列出我要映射的具体类型。
我该怎么做?
更新: 为了提高清晰度,我将进一步描述文章类。有
...条
公共抽象类ArticleBase:Entity,IArticle { ... }
public class ArticleX : ArticleBase
{
public IList<Image> Images {get; set;}
...
}
public class ArticleY : ArticleBase
{
public IList<Image> Images {get;set;}
...
}
还有Image类。每篇文章都有图像和图像与文章有一对多关系。
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"}
答案 0 :(得分:1)
这一般不会起作用。只有在我们已经映射interface
(事实上充当抽象类)的情况下,它才能起作用,例如:8.1.1. Table per class hierarchy,例如:
<class name="IArticle" table="Articles">
...
<discriminator column="Discriminator" />
<subclass name="Article1" discriminator-value="Article1">
...
Mapping-by-Code - inheritance:
public class ArticleBaseMap : ClassMapping<IArticle>
{
public ArticleBaseMap()
{
Discriminator(x =>
{
x.Column("discriminator");
子类:
public class Article1Map : SubclassMapping<Article1>
{
public Article1Map()
{
DiscriminatorValue("Article1");
...
这样的映射层次结构不应该抛出&#34;关联引用未映射&#34; 。因此,在这种情况下,映射将要求引用的interface
或abstract / base类被映射 - 作为层次结构。
为清楚起见,我建议映射抽象类,以避免混淆(可以将IArticle
的任何实现添加到Bag
)。实际上,我没有看到从Buisness域实体角度映射 interfaces 的任何优势。