【问题标题】:How to map two objects that reference each other in NHibernate?如何在 NHibernate 中映射两个相互引用的对象?
【发布时间】:2010-11-13 20:49:43
【问题描述】:

我有一个如下所示的课程:

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 公司的 Jobs 映射到 B 公司的 Jobs。有没有一种方法可以使用 NHibernate 进行映射,而无需更改实体对象的外观?我知道我可以像普通的多对多关系一样添加列表属性和技巧,但这必须是有人有更好解决方案的模式。

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

【问题讨论】:

  • 如果您有能力将身份更改为 NHibernate 可以为您完成的事情(hilo、guid.comb 等)。
  • 我不知道这将如何解决问题。问题在于,按照现在数据库表的设置方式,表上的 FK 永远不会让一个 Job 在没有另一个 Job 的 Id 的情况下被保存(也没有保存)。所以我想我需要改变我的数据库架构。
  • 忘记了数据库约束,抱歉。

标签: nhibernate fluent-nhibernate


【解决方案1】:

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

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

【讨论】:

  • 这就是我现在所拥有的,但这会导致先有鸡还是先有蛋的问题,即在保存另一个作业之前无法保存一个作业,但由于它们都相互引用,因此两者都无法保存.
  • 乔恩,我认为您需要在创建关联之前保留 jobA 和 jobB。这将导致对数据库的多次点击,但会给你想要的结果。此处显示的映射是正确的。
【解决方案2】:

如果不创建另一个没有这些引用的实体,我不知道该怎么做,这样您就可以保存空值。保存其中两个虚拟实体并获取它们的 ID。然后通过您已经拥有的 Job 实体使用它们的 id 检索它们中的每一个,并以这种方式将它们设置为彼此。那你应该可以保存了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多