映射接口或抽象类部件(Mapping interface or abstract class com

2019-08-17 17:18发布

请考虑下面简单的例子:

public class Foo 
{ 
    public virtual int Id { get; protected set; } 
    public virtual IBar Bar { get; set; } 
} 

public interface IBar 
{ 
    string Text { get; set; } 
} 

public class Bar : IBar 
{ 
    public virtual string Text { get; set; } 
} 

而流利,NHibernate的地图类:

public class FooMap : ClassMap<Foo> 
{ 
    public FooMap() 
    { 
        Id(x => x.Id); 
        Component(x => x.Bar, m => 
        { 
            m.Map(x => x.Text); 
        }); 
    } 
} 

当运行与配置进行任何查询,我得到下面的异常:

NHibernate.InstantiationException:“不能实例化抽象类或接口:NHMappingTest.IBar”

看来,NHibernate的尝试实例化IBar对象代替的Bar具体类。 如何让流利,NHibernate的知道什么时候该属性返回一个接口或抽象基类实例化哪个具体类?

编辑:显式写指定成分的种类Component<Bar> (由狡猾的建议)没有任何作用,会导致发生相同的异常。

EDIT2:由于vedklyv和保罗·巴图姆:这样的映射应该很快 成为可能

Answer 1:

我还没有尝试过这个自己,但我看到在拉姆达被转换为具体类的流畅NH源的例子:

public class FooMap : ClassMap<Foo> 
{ 
    public FooMap() 
    { 
        Id(x => x.Id); 
        Component(x => (Bar) x.Bar, m => 
        { 
            m.Map(x => x.Text); 
        }); 
    } 
}

编辑:显然,这完全一样的结果狡猾的建议,这样做不好。 我测试了它反对流畅NH的主干版本并没有奏效。 的工作,虽然如果你使用一个多到一的映射:

  public class FooMap : ClassMap<Foo>
  {
    public FooMap()
    {
      Id(x => x.Id);
      References<Bar>(x => x.Bar).Cascade.All();
    }
  }

  public class BarMap : ClassMap<Bar>
  {
    public BarMap()
    {
      Id(x => x.Id);
      Map(x => x.Text);
    }
  }

UPDATE

这实际上是一个容易解决。 我已经提交了一个补丁( 链接文本 ),使狡猾的解决方案正常工作。



Answer 2:

也许这?

public FooMap()
    {
        Id(x => x.Id);
        Component<Bar>(x => x.Bar, m =>
        {
            m.Map(x => x.Text);
        });
    }


Answer 3:

下面是使用union-子类的方法类似的话题,虽然如不使用流畅的界面图:

点击文章...



Answer 4:

未使用流利的NHibernate还没有,但在我看来,你正在尝试做的是地图,你还没有告诉休眠状态如何处理的IUserType。 这里是用于流利定义usertypes一个有用的例子。

http://blog.jagregory.com/2009/01/11/fluent-nhibernate-auto-mapping-type-conventions/



文章来源: Mapping interface or abstract class component