映射具体类型,通过代码使用nhibernate映射实现接口

本文关键字:映射 nhibernate 接口 实现 代码 类型 | 更新日期: 2023-09-27 17:59:46

我想通过代码使用nhibernate映射一对多集合

..
   Bag(x => x.Articles,
     c => {  },
     r => { r.OneToMany(); }
   );

文章是IList<IArticle>,假设我有实现IArticle的具体对象(MyArticleMyArticle2)。

由于我得到了错误{"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"}

映射具体类型,通过代码使用nhibernate映射实现接口

这通常不会起作用。它只能在我们已经映射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域实体的角度映射接口没有任何好处。