我有一个类结构,类似于PurchaseOrder(父)和PurchaseOrderLine(子)模式,其中订单行只会通过保存父PurchaseOrder保存到DB,并且只会通过父级访问
DB将PurchaseOrderLine.PurchaseOrder设置为不允许空值。
通过网络搜索似乎无法通过IList属性从PurchaseOrder获得单向关联,而不必在该行对其PurchaseOrder具有NOT NULL约束时指向该行的属性列。
这是真的吗?这似乎是人们想要用ORM做的最基本的事情之一,我发现很难接受像NHibernate这样成熟的产品无法处理这样的基本情况。
答案 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();