Nhibernate支持四种集合:
1 Bags
Bags中的数据允许重复,并且顺序在Bag中是不重要的。比如一个ActorRole的Bag集合,可能包含actor role 1, actor role 2, actor role 3, actor role 1,
actor role 4, and actor role 1,它们中允许有重复项出现。下面是一个典型的Bag映射:
<bag name="Actors"> <key column="MovieId"/> <one-to-many class="ActorRole"/> </bag>
在相应的类中,Bag的实现可以为IList、ICollection甚至 IEnumerable.
因为Bag中的数据是可重复的,所以我们不能通过一条简单的SQL语句如:delete from Actors where ActorRoleId='1'来确定删除某一条数据,如果执行这条语句会把三个actor role 1的实体都删除。
为了解决这个问题,Nhibernate提供了idBag.在idBag中,每一个实体都被分配了一个POID来唯一确定实体。
<idBag name="Actors"> <collection-id column="ActorRoleBagId" type="Int64"> <generator class="hilo" /> </collection-id> <key column="MovieId"/> <one-to-many class="ActorRole"/> </idBag>
这样Nhibernate就可以像执行这条语句:delete from Actors where ActorRoleBagId='2'一样来删除唯一的实体。
2 Lists
List中的数据也是可重复的,但与Bag不一样,数据的所处位置是有意义的。一个List可能是index 0为actor role 1 , index 1为actor role 2, index 2为actor role 3, index 3为actor role 1,index 4为actor role 4,index 5为actor role 1.一个典型的List映射如下:
<list name="Actors"> <key column="MovieId" /> <list-index column="ActorRoleIndex" /> <one-to-many class="ActorRole"/> </list>
在相应的类中,List的实现应为IList。
3 Sets
Set中的数据是不允许重复的,数据出现的位置也无关紧要。在一个Set中,可能有actor role 1, actor role 3, actor role 2, 和 actor role 4.如果你尝试向Set中插入actor role 1的实体,这个操作将为失败。一个典型的Set映射如下:
<set name="Actors"> <key column="MovieId" /> <one-to-many class="ActorRole"/> </set>
在相应的类中,Set的实现应为来自Iesi.Collections.dll的ISet。
4 Map
Map就像一个字典,每一个集合中的实体都拥有一个key和一个value,并且key必须是唯一的。一个典型的映射如下:
<map name="Actors" > <key column="MovieId" /> <map-key column="Role" type="string" /> <element column="Actor" type="string"/> </map>
在相应的类中,Map的实现应为IDictionary<string, string>。
当然,允许映射的数据类型有很多,不单单是string。一个Map的key或value的数据类型甚至可以是一个实体。
<map name="SomeProperty"> <key column="Id" /> <index-many-to-many class="KeyEntity"/> <many-to-many class="ValueEntity" /> </map>