Свободный NHibernate - HasOne с пунктом Где - PullRequest
1 голос
/ 24 августа 2011

с помощью Fluent NHibernate я могу сопоставить отношения один ко многим с моим классом пользователя, сказав:

HasMany(x => x.Membership)
    .KeyColumn("UserID")
    .Where("Deleted = 0");

Это работает, как и ожидалось, так как он захватывает только те записи о членстве, которые не были удалены.Нет, скажем, у меня есть поле «Последние против членства», где я знаю, что будет возвращаться одна запись на пользователя, я бы хотел сказать:

HasOne(x => x.CurrentMembership)
    .Where("Current = 1");

Но нет метода Где.Я знаю, что мог бы сделать это в коде, говоря:

public virtual Membership CurrentMembership
    { get { return Membership.Single(m => m.Current); } }

Но это не позволяет мне выполнять LINQ-запросы к этому свойству.Я просто принял это как ограничение в прошлом, но это действительно начинает кусать меня с точки зрения производительности.

Я был бы очень признателен, если бы кто-то мог помочь.

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Вы уверены, что имеете в виду «HasOne», а не «многие к одному» («Рекомендации»)?

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

0 голосов
/ 24 августа 2011
HasOne(x => x.CurrentMembership)
    .Where("Current = 1");

Если сущность имеет отношение «HasOne» к другой, то есть только одна вещь, на которую она может ссылаться, поэтому метод Where не имеет смысла.Если ваш код случайно не обновит старое членство, чтобы иметь Current = 0, то будет 2 экземпляра CurrentMembership, на которые он мог бы ссылаться, и вы были бы довольно испорчены.

Я думаю, что у вас естьпроблема в дизайне вашей базы данных.Лучший способ реализовать это - использовать CurrentMembershipID в таблице User, а затем напрямую связываться с ним с помощью HasOne.Это меньше затрат для вашей базы данных (вам не нужно хранить столбец Current в таблице членства), и она будет эффективно выполнять то, что вы ищете.Кроме того, это позволяет избежать использования пользователем более одного членства с текущим значением, равным 1.

...