Свободное отображение NH и интерфейса - PullRequest
2 голосов
/ 10 марта 2010

Я действительно сбит с толку, поскольку у меня есть несколько объектов, которые имеют общий интерфейс, отображаемый с использованием 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>();
                                    })
            ;

Теперь странным в этом отображении является то, что он позволяет мне выполнять запросы к IPipelineStep с использованием API Criteria, но не с 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 голосов
/ 21 апреля 2010

с HQL вам нужно импортировать реальный интерфейс, чтобы он знал об этом.

В файл HBM входит следующее:

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

очевидно, имеет смысл сначала.

...