请考虑以下简单用例:
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/