Свободные отношения NHibernate и друга - PullRequest
3 голосов
/ 21 декабря 2010

Мне нужно смоделировать дружеские отношения с Fluent NHibernate.Моя модель компании имеет List<Company> Related со связанными компаниями.Отношения между компаниями смоделированы в моей базе данных в таблице related, которая выглядит следующим образом:

customer_id | related_id

Оба столбца являются внешним ключом PK в моей таблице customers.

Проблема в том, что отношения сохраняются только один раз для каждой пары (вы называете это двунаправленным?).

Я могу изменить структуру таблицы, если онапроще решить по-другому.

Мне нужно отобразить Fluent NHibernate так, чтобы, когда я делаю customer.Related(), он генерирует запрос вроде:

SELECT * FROM companies LEFT JOIN related ON customer_id = id OR related_id = id

Я пыталсяЧтобы отобразить это несколькими различными способами, я пробовал следующее:

HasManyToMany(x => x.Related)
       .Inverse()
       .ParentKeyColumn("customer_id")
       .ChildKeyColumn("related_id")
       .Table("relations")
       .Cascade.All();

Однако, это (конечно) только сопоставление, когда customer_id совпадает.

Как мне решитьthis?

Редактировать: Я думаю, что это похоже на Свободный NHibernate: Как создать двунаправленное отображение один-ко-многим? , но это мне мало помогает.

1 Ответ

0 голосов
/ 22 мая 2011

Я думаю, что вы хотите достичь, это уже наполовину сделано.Вы уже сопоставили 2 сущности с отношением Many2Many.Я бы больше не трогал отображение.

Вместо этого я бы спросил, что я хочу, через это отображение.Примерно так.

function GetRelated(long id){

   return Session.Query<Related>()
                 .Where(r=>r.Customer.Id == id || r.Related.Id == id)
                 .ToList(); 
}

Рекомендация, имя сопоставляемого объекта - «Связанный», и у вас есть связанное поле, которое может показаться странным, поэтому я бы предложил переименовать его во что-то другое (если это возможно).

Надеюсь, это поможет.

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