NHibernate/ActiveRecord-有没有只映射到外键列的方法?

NHibernate/ActiveRecord-有没有只映射到外键列的方法?,nhibernate,activerecord,castle-activerecord,Nhibernate,Activerecord,Castle Activerecord,我正在使用Castle ActiveRecord,但这个问题也适用于NHibernate,因为与NHibernate一起使用的解决方案应该适用于ActiveRecord。总之,我有一个底层表结构,如下所示: 表A-有许多->表B 我有对应的对象EntityA和EntityB。EntityA具有EntityB对象的IList。这部分很好用。现在,我想让EntityB有一些对EntityA的引用。我知道我可以使用EntityB上的BelongsTo属性为其提供返回完整EntityA类型的实际引用,如

我正在使用Castle ActiveRecord,但这个问题也适用于NHibernate,因为与NHibernate一起使用的解决方案应该适用于ActiveRecord。总之,我有一个底层表结构,如下所示:

表A-有许多->表B

我有对应的对象EntityA和EntityB。EntityA具有EntityB对象的IList。这部分很好用。现在,我想让EntityB有一些对EntityA的引用。我知道我可以使用EntityB上的BelongsTo属性为其提供返回完整EntityA类型的实际引用,如:

[BelongsTo("tableAid")]
public EntityA Parent { get; set; }
但我真正想做的是:

[BelongsTo("tableAid")]
public int ParentId { get; set; }
因此,EntityB将只存储父对象的ID,而不存储对实际对象的引用。这是一个微不足道的例子,但我有充分的理由希望采用这种方法。在我正在处理的应用程序中,我们有一些页面显示特定的EntityB类对象,我们希望这些页面包含指向相应父页面的链接(如超链接)。我们可以通过使用上面的第一种方法来实现这一点,但这需要在我真正需要的只是ID的情况下加载整个EntityA对象。这不是什么大问题,但似乎是浪费。我知道我可以使用惰性加载,但再一次,对我来说,这更像是一种黑客行为

我已尝试使用[Property]属性标记外键,如下所示:

[Property]
public int ParentId { get; set; }
这种方法的问题是,在新对象树上执行EntityA.SaveAndFlush()时,EntityB.ParentId保持为null。正确的值正在写入数据库,我可以通过执行EntityA.Refresh()将该值强制返回EntityB.ParentId,但这似乎有点像黑客攻击。

仅此而已:

[Property] public int ParentId { get; set; }
…假设
ParentId
是实际的列名

还有一些其他的评论

首先,你应该考虑懒惰地加载多个属性。如果您急切地加载它们,您必须知道可能会出现的急切加载级联,这可能会严重影响性能。为此,必须将延迟加载类的所有公共成员标记为虚拟


第二,请注意,任何时候当您有一对多的关联,而从子对象到父对象没有对应关系时,您必须使FK在数据库中为空。这是因为当NH创建新的子项时,它将插入父id为空的子项,然后在第二步中更新它。

延迟加载正是您想要的-而且它也不是一个黑客,它是NHIbernate中经过良好测试和烘焙的一部分,是调整任何重要NHIbernate应用程序性能的一个重要工具


如果要将“父”EntityA标记为延迟加载,则引用EntityB.parent.Id根本不会加载EntityA(因为后台NHIbernate在加载EntityB时已经加载了EntityA的Id),这样就可以设置链接而不会导致性能损失

谢谢你的建议。实际上我已经尝试过这种方法,我只是忘了在问题中列出它。它主要起作用,但并不完美(