2009-07-24 3 views
0

У меня есть класс, который выглядит следующим образом:Как сопоставить два объекта, которые ссылаются друг на друга в NHibernate?

public class Job 
{ 
    public Company Company {get;set;} 
    public Job JobForCompanyA {get;set;} 
    public Job JobForCompanyB {get;set;} 
} 

The рабочие места для двух компаний будут ссылаться друг на друга, например:

var jobA = new Job { Company = Company.CompanyA }; 
var jobB = new Job { Company = Company.CompabyB }; 
jobA.JobForCompanyB = jobB; 
jobB.JobForCompanyA = jobA; 

Проблема с этим состоит в том, что если я карте их как нормальные многие-к-одному в NHibernate, они не могут их сохранить ... так как каждый объект Job ссылается на другой, вам придется сохранить его, чтобы получить PK, но вы не можете, потому что он ссылается на другой (несохраненный) Job, так что у вас есть проблема с курицей и яйцом.

С точки зрения db я мог бы составить таблицу сопоставления, которая сопоставляет задания для компании A для рабочих мест для компании B. Есть ли способ сопоставить это с помощью NHibernate без меня, чтобы изменить, как выглядит объект объекта? Я знаю, что могу добавить свойства списка и хаки, чтобы сделать это, как нормальное отношение «многие ко многим», но это должно быть шаблон, для которого у кого-то есть лучшее решение.

Я использую Fluent NHibernate, поэтому вы можете дать мне решения с использованием XML-карт Fluent NHibernate или NHibernate.

+0

Если у вас есть сила, измените личность на то, что может быть сделано NHibernate для вас (hilo, guid.comb и т. Д.). – anonymous

+0

Я не вижу, как это исправит проблему. Проблема в том, что с тем, как сейчас устанавливаются таблицы базы данных, FK в таблице никогда не позволят одному Job быть сохраненным без Id другого задания (которое также не сохраняется). Поэтому я думаю, что мне нужно изменить схему базы данных. –

+0

Забыл о ограничениях db, извините. – anonymous

ответ

1

Это плавное сопоставление позволит вам ссылаться на несколько свойств одного и того же типа. Здесь я предполагаю, что в вашей таблице Job у вас есть два столбца (JobAId и JobBId), которые ссылаются на другое задание (через JobId).

Рекомендации (x => x. JobForCompanyA, "JobAId"); Ссылки (x => x. JobForCompanyB, "JobBId");

+0

Это то, что у меня есть сейчас, но это приводит к проблеме курица и яйцо, когда один Иов не может быть сохранен до тех пор, пока другой не будет сохранен, но поскольку оба они ссылаются друг на друга, они не могут быть сохранены. –

+1

Jon, Я думаю, вам нужно сохранить работу и работуB ПЕРЕД созданием ассоциации. Это приведет к нескольким ударам по базе данных, но даст вам желаемый результат. Отображение, представленное здесь, является правильным. – wgpubs

0

Я не вижу, как это сделать, не создавая другого объекта без какой-либо из этих ссылок, чтобы вы могли получить нулевые значения. Сохраните два этих фиктивных объекта и возьмите их идентификаторы. Затем извлеките каждый из них с помощью своих идентификаторов через объект Job, который у вас уже есть, и установите их друг другу таким образом. Тогда вы сможете сэкономить.

Это некрасиво, но это почти так, как вам придется делать это в SQL в любом случае. Я бы подумал о том, чтобы придумать другую модель, если бы я был вами.

Смежные вопросы