一、集合外键
在NHibernate中,典型的用于映射集合类的元素有<set>,<list>,<map>,<bag>,<array>,<primitive-array>。
我们回到上一篇,集合映射基础当中的一对多查询。对于集合类型:
public virtual ISet<PersonModel> ListPerson { get; set; }
NHibernate的配置文件与之对应的是:
<set name="ListPerson" table="Person" generic="true" inverse="true"> <key column="CountryId" foreign-key="FK_Person_Country"/> <!-- Person的拥有者 外键列名 --> <one-to-many class="Model.PersonModel,Model"/> </set>
那么<set>、<list>、<map>、<bag>、<array>、<primitive-array>这些东西的用法以及它们之间的区别是什么呢?
1.<set>
ISet<Model>集合中的对象是唯一的,无序的,不能通过索引、key值访问。
在.Net中并没有与<set>对应的类。因此当我们的配置文件是<set>配置集合关系的时候,Model持久化类中ISet<Model>必须使用NHibernate的Iesi.Collections的。
2.<bag>
<bag>跟<set>基本一样,唯一不同之处在于bag中允许重复对象。
与<bag>配置对应的集合类型是IList<Model>。
3.<list>
有序集合,可以重复,使用从0开始的整数作为索引。因此,在配置<list>节点的时候必须要有<index>,并且index指定的列类型必须为整型。
与<list>配置对应的集合类型是IList<Model>。
4.<map>
无序集合,key值不能重复,值可以重复,可以使用任意类型的对象作为索引。
与<map>配置对应的集合类型是IDictionary<key,value>。
首先我们根据数据之间的关系,从<set>, <bag>, <list>, <map>中选择合适的映射配置节点。下表是配置节点与接口类型对应关系:
对应的集合属性必须使用接口声明,因为NHibernate返回的集合对象类型,是它内部对这些接口的实现,即NHibernate.Collection命名空间下的PersistentSet、PersistentList、PersistentBag、PersistentMap,而不是ListSet、HashTable等。按照NHibernate的规定使用这些接口的具体类,NHibernate在存取时能够自动转换处理。
.Net中没有set和bag的实现,所以NHibernate使用Iesi.Collections的set,使用IList模拟bag语义。
如果属性不希望使用这些接口,可以使用access。将field设置为接口类型,在property的get, set方法中完成类型转换,通过属性配置中的access设置,让NHibernate绕开get, set方法直接存取field。
<list name="Addresses" table="USER_ADDRESS"> <key column="USER_ID"/> <index column="ADDR_INDEX"/> <element column="ADDRESS" type="String"/> </list>
<map>与<list>的区别在于,<list>的index是整型,而<map>的index可以为任意类型,所以<map>中的<index>节点可以指定type属性。有的情况下,可能通过关联使用其它实体作为index,因此NHibernate为<map>提供了另外一种index配置方式,<index-many-to-many>和<index-many-to-any>。其它配置跟<set>一样。
set | bag | list | map | |
是否允许重复 | 否 | 是 | 是 | key不能重复,值可以重复 |
显式排序 | 否 | 否 | 是 | 否 |
对一个类型 | Iesi.Collections.ISet | IList | IList | IDictionary |
四者的差别就在上面,可以根据实际情况,进行选用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述