如何在NHibernate中映射两个相互引用的对象?

时间:2009-07-24 19:46:35

标签: nhibernate fluent-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 ,但你不能,因为它引用了另一个(未保存的)Job,所以你有鸡和蛋的问题。

从db的角度来看,我可以创建一个映射表,将公司A的Jobs映射到公司B的Jobs。有没有办法使用NHibernate映射它,而不必更改我的实体对象的外观?我知道我可以添加列表属性和黑客,就像正常的多对多关系一样,但这必须是某人有更好的解决方案的模式。

我正在使用Fluent NHibernate,因此您可以使用Fluent NHibernate或NHibernate XML映射为我提供解决方案。

2 个答案:

答案 0 :(得分:1)

这种流畅的映射将允许您引用相同类型的多个属性。在这里,我假设您的Job表中有两列(JobAId和JobBId)引用另一个Job(通过JobId)。

参考文献(x => x.JobForCompanyA,“JobAId”); 参考文献(x => x.JobForCompanyB,“JobBId”);

答案 1 :(得分:0)

我没有看到如何在没有创建这些引用的情况下创建另一个实体,因此您可以保存空值。保存其中两个虚拟实体并获取它们的ID。然后通过你已经拥有的Job实体使用它们的id检索它们,并以这种方式将它们设置为彼此。你应该可以保存。

这很丑陋,但无论如何,这几乎都是你必须在SQL中做到的。如果我是你,我会考虑提出一个不同的模式。