NHibernate - присоединиться без отображения - PullRequest
3 голосов
/ 05 февраля 2009

Можно ли объединить два класса без определенного сопоставления между ними (используя Criteria API)?

Я должен объединить два класса и получить данные из обоих, но я не могу отобразить их. Я знаю только внешний ключ SomeID в первом классе и первичный ключ ID во втором.

Как создать критерии для присоединения к ним? Возможно ли это без отображения?

Пожалуйста, помогите, мне это действительно нужно, но я застрял. : /

PS

Я знаю любое сопоставление, но у меня есть 10 полей, например SomeID. Создание любых отображений только для 10 полей для создания объединений - это излишне. Если нет другого решения, я сделаю это, но я не хочу.

Ответы [ 2 ]

6 голосов
/ 05 февраля 2009

Я не знаю версию критерия, но в HQL вы можете сделать это так:

select customer, order from Customer customer, Order order 
    where order.CustomerID = customer.Id
    and customer.Id = 42

В качестве результирующего набора будет представлен список объекта [], в котором клиент будет повторяться, умножая количество размещенных им заказов (при условии, конечно, что во многих заказах один клиент).

Обратите внимание, что результат будет пустым, если нет орд.

1 голос
/ 22 ноября 2012

Если вы не хотите или не можете определить свойства ассоциации в ваших сущностях (как в модульных приложениях, которые поддерживают динамическую загрузку плагинов), вы все равно можете создавать «поддельные» ассоциации с помощью API Fluent.

См. Исходный код Orchard, класс «ContentItemAlteration». В Orchard сущность ContentItem требуется объединить с записями ContentPart, хранящимися в разных таблицах. Каждый тип ContentPart предоставляется модулями, что означает, что трудно (и, вероятно, не желательно) изменить источник ContentItem и добавить ассоциацию для каждой новой записи детали.

Вот точный код, полученный из источников в Орчарде:

/// <summary>
    /// Add a "fake" column to the automapping record so that the column can be
    /// referenced when building joins accross content item record tables.
    /// <typeparam name="TItemRecord">Either ContentItemRecord or ContentItemVersionRecord</typeparam>
    /// <typeparam name="TPartRecord">A part record (deriving from TItemRecord)</typeparam>
    /// </summary>
    class Alteration<TItemRecord, TPartRecord> : IAlteration<TItemRecord> {
        public void Override(AutoMapping<TItemRecord> mapping) {

            // public TPartRecord TPartRecord {get;set;}
            var name = typeof(TPartRecord).Name;
            var dynamicMethod = new DynamicMethod(name, typeof(TPartRecord), null, typeof(TItemRecord));
            var syntheticMethod = new SyntheticMethodInfo(dynamicMethod, typeof(TItemRecord));
            var syntheticProperty = new SyntheticPropertyInfo(syntheticMethod);

            // record => record.TPartRecord
            var parameter = Expression.Parameter(typeof(TItemRecord), "record");
            var syntheticExpression = (Expression<Func<TItemRecord, TPartRecord>>)Expression.Lambda(
                typeof(Func<TItemRecord, TPartRecord>),
                Expression.Property(parameter, syntheticProperty),
                parameter);

            mapping.References(syntheticExpression)
                .Access.NoOp()
                .Column("Id")
                .ForeignKey("none") // prevent foreign key constraint from ContentItem(Version)Record to TPartRecord
                .Unique()
                .Not.Insert()
                .Not.Update()
                .Cascade.All();
        }
    }

Этот код просто добавляет ассоциацию "части" в ContentItem, которая позволяет использовать соединения в ваших критериях. Если, например, у вас есть деталь с именем «ProductPart», которая хранится в таблице с именем «ProductPartRecord», то вы можете присоединить свой ContentItem к поддельному свойству «ProductPartRecord».

Кстати, похоже, эту тактику можно применить и к стороне HasMany фальшивого отношения, но я полагаю, вы должны настроить источники Fluent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...