映射接口或抽象类组件请考虑以下简单用例:publicclassFoo{publicvirtualintId{get;保护集;}publicvirtualIBarBar{get;放;}}publicinterfaceIBar{stringText{get;放;}}publicclassBar:IBar{publicvirtualstringText{get;放;}}和流畅的nhibernate映射类:publicclassFooMap:ClassMap{publicFooMap(){Id(x=>x.Id);Component(x=>x.Bar,m=>{m.Map(x=>x.Text);});当使用配置运行任何查询时,我得到以下异常:NHibernate.InstantiationException:"Cannotinstantiateabstractclassorinterface:NHMappingTest.IBar"NHibernate似乎试图实例化IBar对象而不是Bar具体类。当属性返回接口或抽象基类时,如何让Fluent-NHibernate知道要实例化哪个具体类?编辑:通过编写Component(Sly建议)显式指定组件类型是无效的,并会导致发生相同的异常。EDIT2:感谢vedklyv和PaulBatum:这样的映射现在将很快成为可能。我自己没有尝试过,但我在fluentnh源代码中看到了一个示例,其中lambda被转换为具体类:publicclassFooMap:ClassMap{publicFooMap(){Id(x=>x.Id);Component(x=>(Bar)x.Bar,m=>{m.Map(x=>x.Text);});编辑:显然这完全符合Sly的建议,所以没有任何好处。我用fluentnh的trunk版本测试了一下,没用。如果您使用多对一映射,它确实有效:publicclassFooMap:ClassMap{publicFooMap(){Id(x=>x.Id);引用(x=>x.Bar).Cascade.All();}}publicclassBarMap:ClassMap{publicBarMap(){Id(x=>x.Id);地图(x=>x.文本);}}UPDATE这实际上很容易修复。我已经提交了一个使Sly的解决方案起作用的补丁(链接文本)。也许这个?publicFooMap(){Id(x=>x.Id);Component(x=>x.Bar,m=>{m.Map(x=>x.Text);});这是使用union-subclass类似主题的方法,虽然示例没有使用fluentinterfacetomap:点击查看文章...还没有使用过fluentNHibernate,但在我看来,你想要做的是映射到一个IUserType,你还没有告诉hibernate如何处理它。这是流利定义的用户类型的有用示例。http://blog.jagregory.com/2009/01/11/fluent-nhibernate-auto-mapping-type-conventions/以上就是C#学习教程的全部内容:映射接口或抽象类组件分享,如果你有什么有用的,需要了解更多的C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
