2009-07-24 104 views
0

我有一個類,看起來像這樣:如何映射兩個在NHibernate中相互引用的對象?

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

兩家公司的就業機會將相互引用,例如:

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

這樣做的問題是,如果我映射這些爲正常的多對一的NHibernate,它不能保存它們......因爲每個Job對象引用另一個,你將不得不保存一個獲得PK,但你不能因爲它引用了另一個(未保存的)工作,所以你有雞和雞蛋的問題。

從數據庫的角度來看,我可以做一個映射喬布斯用於公司A喬布斯,B公司是否有辦法沒有我不得不改變我的實體對象看起來如何映射這個使用NHibernate的映射表?我知道我可以添加列表屬性和黑客來完成它,就像一個普通的多對多關係一樣,但這必須是某人有更好解決方案的模式。

我用流利的NHibernate的,所以你可以給我用流利的NHibernate的NHibernate的或XML映射解決方案。

+0

如果你有能力改變身份的東西,可以通過NHibernate的你(希洛,guid.comb等)來完成。 – anonymous 2009-07-24 19:54:13

+0

我看不出如何解決問題。問題在於,現在數據庫表的設置方式,桌面上的FK永遠不會讓其中一個作業被保存,而沒有另一個作業的ID(這也不會被保存)。所以我想我需要改變我的數據庫模式。 – 2009-07-24 20:02:17

回答

1

這個流利的映射將允許您引用同一類型的多個屬性。在這裏,我假設你的Job表中有兩個引用另一個Job(通過JobId)的列(JobAId和JobBId)。

參考文獻(X => X JobForCompanyA, 「JobAId」。); 參考文獻(x => x。JobForCompanyB,「JobBId」);

0

我不知道如何做到這一點不與這些文獻中沒有創造另一個實體,讓你可以保存空值。保存這些虛擬實體中的兩個並獲取它們的ID。然後通過您已有的Job實體使用它們的ID檢索它們中的每一個,並將它們設置爲彼此相同。你應該可以保存。

這是醜陋的,但是這幾乎是你怎麼也得做,在SQL反正。如果我是你,我會考慮採用不同的模式。

相關問題