单向父子关联不为空

时间:2011-10-28 21:21:19

标签: nhibernate fluent-nhibernate

我有一个类结构,类似于PurchaseOrder(父)和PurchaseOrderLine(子)模式,其中订单行只会通过保存父PurchaseOrder保存到DB,并且只会通过父级访问

DB将PurchaseOrderLine.PurchaseOrder设置为不允许空值。

通过网络搜索似乎无法通过IList属性从PurchaseOrder获得单向关联,而不必在该行对其PurchaseOrder具有NOT NULL约束时指向该行的属性列。

这是真的吗?这似乎是人们想要用ORM做的最基本的事情之一,我发现很难接受像NHibernate这样成熟的产品无法处理这样的基本情况。

3 个答案:

答案 0 :(得分:0)

不是不是这样。请参阅此问题的答案中提供的示例:When to use inverse=false on NHibernate / Hibernate OneToMany relationships?

答案 1 :(得分:0)

嗯,可能的情况是,您不能仅在一个方面定义单向一对多关系,但我会与您争论声明这是“人们想要用ORM做的最基本的事情之一”。

最基本的事情之一就是只在许多方面定义单向一对多 - 因为它对于RDBM表来说是自然< / strong>即可。 ORM(尽管存在常见的误解)无意(或无法)从底层数据源完全抽象域模型。即使在某些情况下它们可以,数据库端也会遇到选择的N + 1问题或非常无效的查询。

一个一侧定义一对多会给人一种印象,即计算收藏价格便宜。普通对象图是这种情况,但NHibernate实体却不是这样,因为读取集合会导致(至少一次)调用数据库。急于从一个端获取也无法以预期的方式正确使用数据库连接机制(与许多端的急切提取相反)。

即使我不同意很多论点,我认为阅读一些文章说“ORM是一种反模式”很有用,比如this one。他们帮助我利用我对ORM的看法,让我想到 ORM作为两种不匹配范式之间的妥协,而不是将其隐藏在另一种背后的方式。

答案 2 :(得分:0)

现在可以使用Not.KeyNullable()

在NH3中实现
        this.HasMany(x => x.Actions)
            .Access.BackingField()
            .KeyColumn("[Application]")
            .Not.KeyNullable()
            .Cascade.AllDeleteOrphan();