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

如何映射NHibernate中相互引用的两个对象?,nhibernate,fluent-nhibernate,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

我有一个类似这样的类:

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中的正常多个,它就无法保存它们。。。由于每个作业对象都引用另一个作业,因此必须保存一个作业才能获得PK,但不能保存,因为它引用了另一个(未保存的)作业,因此存在鸡和蛋的问题

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


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

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

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

如果不创建另一个没有这些引用的实体以便保存空值,我不知道如何执行此操作。保存其中两个虚拟实体并获取它们的ID。然后通过已经拥有的作业实体使用它们的ID检索它们中的每一个,并以这种方式相互设置它们。那时你应该可以存钱了


这很难看,但无论如何,在SQL中都必须这样做。如果我是你,我会考虑提出一种不同的模式。

如果你有能力,将身份更改为NHibernate可以为你做的事情(hilo、guid.comb等)。我看不出这将如何解决问题。问题是,按照现在设置数据库表的方式,表上的FKs永远不会让一个作业在没有另一个作业Id的情况下保存(另一个作业也不会保存)。因此,我认为我需要更改我的数据库模式。对不起,忘记了数据库约束。这就是我现在的情况,但这会导致鸡和蛋的问题,即一个作业在另一个保存之前无法保存,但由于它们都相互引用,因此都无法保存。Jon,我认为在创建关联之前需要保留jobA和jobB。这将导致对数据库的多次点击,但会给您期望的结果。这里给出的映射是正确的。