请考虑以下简单用例:

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; }
}

和 fluent-nhibernate map 类:
public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Id(x => x.Id);
        Component(x => x.Bar, m =>
        {
            m.Map(x => x.Text);
        });
    }
}

在使用配置运行任何查询时,我收到以下异常:



NHibernate 似乎试图实例化一个 IBar 对象而不是 Bar 具体类。当属性返回接口(interface)或抽象基类时,如何让 Fluent-NHibernate 知道要实例化哪个具体类?

编辑: 通过编写 Component<Bar>(如 Sly 建议的)显式指定组件的类型没有效果并导致发生相同的异常。

EDIT2: 感谢 vedklyv 和 Paul Batum:这样的映射应该很快 现在 是可能的。

最佳答案

我自己没有尝试过,但我在 fluent nh 源中看到了一个示例,其中 lambda 被转换为具体类:

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

编辑:显然,这与 Sly 的建议结果完全相同,因此没有好处。我针对 fluent 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);
    }
  }

更新

这实际上是一个简单的修复。我已经提交了一个补丁 (link text),它使 Sly 的解决方案起作用。

关于c# - 映射接口(interface)或抽象类组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1548839/

10-10 02:22