流畅的NH和界面映射

时间:2010-03-10 10:47:52

标签: c# nhibernate fluent-nhibernate linq-to-nhibernate

我真的很困惑,因为我有几个共享使用FNH映射的公共接口的对象,如下所示:

            .Where(t => (t.BaseType == typeof(Entity) || t.BaseType == typeof(PipelineStep))
                && t.Namespace.StartsWith("BigNose.Core.Domain") 
                && !t.IsInterface)
            .IgnoreBase<Entity>()
            .IgnoreBase<PipelineStep>()
            .Override<Project>(map => map.HasMany(p => p.Pipelines).Cascade.All())
            .Override<ExpectationProcessingStep>(map =>
                                    {
                                        map.ImportType<IPipelineStep>();
                                        map.ImportType<object>();
                                    })
            ;

现在关于这种映射的奇怪之处在于它似乎允许我使用Criteria api查询IPipelineStep,但不能使用Linq-to-NH或通过HQL查询。例如:

作品(标准):

    UoW.Session.CreateCriteria(typeof(IPipelineStep), "p")
     .Add(Restrictions.Eq("p.Pipeline", SampleData.PipelineB))
     .SetMaxResults(10)
     .List<IPipelineStep>()
     .ToList();

这个Linq失败了:

UoW.Session.Linq<IPipelineStep>()
                           .Where(p => p.Pipeline == SampleData.PipelineB)
                           .ToList();

例外:

  

System.InvalidOperationException:   找不到名为的实体:   BigNose.Core.Domain.PipelineSteps.IPipelineStep

但是,奇怪的是,没有限制,这是有效的

UoW.Session.Linq<IPipelineStep>()
                           .ToList();

使用HQL即使没有限制也会失败:

UoW.Session.CreateQuery("from IPipelineStep p").List<IPipelineStep>()

例外:

  

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:   IPipelineStep未映射[来自   IPipelineStep p]

到底发生了什么,以及我做错了什么。

先谢谢你,克里斯。

1 个答案:

答案 0 :(得分:0)

使用HQL,您需要导入实际的界面,以便了解它。

在HBM文件中包含以下内容:

<import class="Name.Space.IPipelineStep, Assembly" />

显然首先让它变得有意义。