Свободный NHibernate и несколько ключевых столбцов - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть пользовательский объект со свойством IList. Отображение для это выглядит так:

        HasMany(x => x.Forms) 
            .Cascade.None() 
            .AsBag().KeyColumn("Supervisor") 
            .Key(key => key.Not.Update()) 
            .PropertyRef("Email"); 

Теперь у меня есть новый запрос, который по существу добавляет еще один KeyColumn, который также должен заполнить это свойство. По существу, каждая форма может иметь «супервизор» и «альтернативный», и мне это нужно свойство для заполнения любых форм, где User.Email равно один (формируется у пользователя, если User.Email == Form.Supervisor OR User.Email == Form.Alternate).

Есть ли способ сделать это? Просто добавив еще один KeyColumn спецификация просто переопределяет предыдущую и добавляет ключи * * * * * * * * * * * * * * * * * * метод Keys() не позволяет использовать несколько ключевых столбцов, таких как I хочу ... я ищу способ по существу сказать, что это связь должна быть найдена с WHERE Superviser = Email OR Alternate = Email, но, похоже, она не поддерживает это предложение OR ...

Мой другой вариант, по сути, дублирует это отображение, но для «Альтернативы» в другом свойстве, а затем объединяет коллекции в моем потребляющем коде, но я хотел посмотреть, был ли NHibernate достаточно умен, чтобы это было возможно ...

Есть предложения?

1 Ответ

1 голос
/ 28 апреля 2011

Насколько мне известно, нет - NHibernate не поддерживает этот необычный тип объединения.Я бы подошел к этому так, как вы сказали.Используйте две коллекции - User.SupervisorForms и User.AlternateForms, затем объедините их позже, возможно, используя для этого метод Concat LINQ.Вы можете определить свойство для этой конкатенации за вас:

public virtual IEnumerable<Form> Forms
{
    get { return SupervisorForms.Concat(AlternateForms); }
}

Если вы хотите загрузить User с полностью инициализированной коллекцией Forms за один прием в базу данных, то выможно использовать этот подход из раздела Improving Performace - Multi Query документации NHibernate:

User user = s.CreateMultiQuery()
    .Add("select u from User u left join fetch u.SupervisorForms where u.Id = :id")
    .Add("select u from User u left join fetch u.AlternateForms where u.Id = :id")
    .SetInt32("id", 123)
    .UniqueResult<User>();

Этот код использует CreateMultiQuery() и HQL - но подход должен работать так же хорошо сваш выбор синтаксиса пакетного запроса: CreateMultiQuery(), CreateMultiCriteria() или Future() / FutureValue().

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