使用代码的nhibernate映射映射实现接口的具体类型

时间:2014-04-24 13:42:30

标签: c# .net nhibernate nhibernate-mapping

我想使用代码

的nhibernate映射一个到多个集合
..
   Bag(x => x.Articles,
     c => {  },
     r => { r.OneToMany(); }
   );

文章是IList<IArticle>,我们可以说我有实现IArticle的具体对象(MyArticleMyArticle2)。

由于我收到错误{"Association references unmapped class: MyApp.Model.IArticle"},我想我必须列出我要映射的具体类型。

我该怎么做?

更新: 为了提高清晰度,我将进一步描述文章类。有

  • IArticle(界面)
  • ArticleBase(抽象类)
  • ArticleX
  • ArticleY
  • ...条

    公共抽象类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"}

1 个答案:

答案 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 的任何优势。