在Nhibernate中,除了外键列之外,我还可以使用映射中的其他标准来进一步限制一对多中的内容吗

本文关键字:进一步 标准 其他 一对多 可以使 Nhibernate 映射 | 更新日期: 2023-09-27 18:30:07

我遇到过这样一种情况,即表a对象需要将一些表B记录映射为一对多,但表B有太多记录链接到特定的表a记录,因此我想进一步限制哪些记录将其映射到一对多。这是一个遗留数据库结构,由于生产中的其他遗留程序,无法轻易更改。

假设表B看起来像这样:

TableBPKey (int not null)
TableAFKey (int not null)
TableBColumn1 (char(4) null)
TableBColumn2 (varchar(50) null)

假设TableBColumn1记录可能包含以某种方式对表B记录进行分类的"N"4个字符代码中的任何一个。

无论如何,假设我已经使用TableAFKey列映射了一对多。我还可以告诉映射我只想要TableBColumn1=="ABCD"的那些记录吗?

任何使用代码映射的方法都是首选解决方案。如果它可以在旧的xml映射中完成,但不能通过代码进行映射,我也会把它作为一个解决方案。

谢谢!

在Nhibernate中,除了外键列之外,我还可以使用映射中的其他标准来进一步限制一对多中的内容吗

我相信一对多上的"Formula"方法就是您想要的。您应该能够使用它来指定其他SQL条件,例如"is_active=1"。

你可以在这里找到更多信息。http://notherdev.blogspot.com.au/2012/02/mapping-by-code-map.html

(更新链接)

map。Where()是我想要的。我测试了它,它有效。您可以将一个sql表达式放在sqlWhere子句之后,它会以这种方式限制结果。

Set<TableBObject>(x => x.TableBRecordsABCDOnly, map =>
            {
                map.Inverse(true);
                map.Cascade(Cascade.All);
                map.Key(k => k.Column(c => c.Name("TableAFKey")));
                map.Where("TableBColumn1 = 'ABCD'");
            },
            action => action.OneToMany());