我真的很困惑,因为我有几个共享使用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]
到底发生了什么,以及我做错了什么。
先谢谢你,克里斯。
答案 0 :(得分:0)
使用HQL,您需要导入实际的界面,以便了解它。
在HBM文件中包含以下内容:
<import class="Name.Space.IPipelineStep, Assembly" />
显然首先让它变得有意义。