📅  最后修改于: 2020-11-19 05:38:31             🧑  作者: Mango
在本章中,我们将介绍如何表示集合。我们可以在NHibernate中使用不同类型的集合,例如-
现在,从.NET的角度来看,我们通常处理列表或类似非常简单的数据结构,列表,字典。 .NET没有各种各样的不同集合类型。那么,NHibernate为什么需要所有这些不同的类型?它确实返回到数据库。
列表是不一定唯一的元素的有序集合。
我们可以使用IList
因此,尽管我们通常可以有一个地址列表,并且从应用程序的角度来看,我们知道元素是唯一的,但列表中没有任何内容阻止我们在该列表中插入重复的元素。
集合是唯一元素的无序集合。如果您尝试将2个重复的元素插入到集合中,则会引发异常。
NHibernate对此没有具体规定。
这是拥有通用集合实现的一种便捷方式。如果您使用的是.NET 4,则可以使用新的HashSet
它是无序的,如果您从数据库中拉回一个地址列表或一个订单列表,除非您放入特定的Order by子句,否则您将不知道它们的顺序。
因此,通常来说,您要从数据库中拉回的数据是集合。
它们是无序元素的唯一集合。
我们将在数据库世界中看到的另一个常见集合是一个包,它类似于集合,但是可以有重复的元素。
在.NET世界中,我们用IList表示它。
套装可能是最常见的,但根据您的应用程序,您还会看到列表和袋子。让我们看一下定义定单的最后一章中下面的customer.hbm.xml文件。
如您所见,我们已将订单集合映射为一个集合。请记住,集合是唯一元素的无序集合。
现在,如果您查看Customer类,您将看到使用ISet定义了Orders属性,如以下程序所示。
public virtual ISet Orders { get; set; }
现在,当该应用程序运行时,您将看到以下输出。
New Customer:
John Doe (00000000-0000-0000-0000-000000000000)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Unspecified)
CreditRating: Good
AverageRating: 42.42424242
Orders:
Order Id: 00000000-0000-0000-0000-000000000000
Order Id: 00000000-0000-0000-0000-000000000000
Reloaded:
John Doe (1f248133-b50a-4ad7-9915-a5b8017d0ff1)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Utc)
CreditRating: Good
AverageRating: 42.4242
Orders:
Order Id: c41af8f2-7124-42a7-91c5-a5b8017d0ff6
Order Id: 657f6bb0-1f42-45fc-8fc7-a5b8017d0ff7
The orders were ordered by:
John Doe (1f248133-b50a-4ad7-9915-a5b8017d0ff1)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Utc)
CreditRating: Good
AverageRating: 42.4242
Orders:
Order Id: c41af8f2-7124-42a7-91c5-a5b8017d0ff6
Order Id: 657f6bb0-1f42-45fc-8fc7-a5b8017d0ff7
John Doe (1f248133-b50a-4ad7-9915-a5b8017d0ff1)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Utc)
CreditRating: Good
AverageRating: 42.4242
Orders:
Order Id: c41af8f2-7124-42a7-91c5-a5b8017d0ff6
Order Id: 657f6bb0-1f42-45fc-8fc7-a5b8017d0ff7
Press to exit...
如果该集合中的项目不需要唯一,那么如果您可以在该集合中具有多个具有相同主键的订单,则最好将其映射为一个包,如以下程序所示。
现在,如果您运行此应用程序,则会出现异常,因为如果我们查看客户类,您会注意到在C#代码中将订单标记为ISet。
因此,我们还需要将其更改为IList,然后在此处,我们需要将HashSet更改为构造函数中的List。
public class Customer {
public Customer() {
MemberSince = DateTime.UtcNow;
Orders = new List();
}
public virtual Guid Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual double AverageRating { get; set; }
public virtual int Points { get; set; }
public virtual bool HasGoldStatus { get; set; }
public virtual DateTime MemberSince { get; set; }
public virtual CustomerCreditRating CreditRating { get; set; }
public virtual Location Address { get; set; }
public virtual IList Orders { get; set; }
public virtual void AddOrder(Order order) { Orders.Add(order); order.Customer = this; }
public override string ToString() {
var result = new StringBuilder();
result.AppendFormat("{1} {2} ({0})\r\n\tPoints: {3}\r\n\tHasGoldStatus:
{4}\r\n\tMemberSince: {5} ({7})\r\n\tCreditRating: {6}\r\n\tAverageRating:
{8}\r\n", Id, FirstName, LastName, Points, HasGoldStatus, MemberSince,
CreditRating, MemberSince.Kind, AverageRating); result.AppendLine("\tOrders:");
foreach(var order in Orders) {
result.AppendLine("\t\t" + order);
}
return result.ToString();
}
}
当您运行该应用程序时,您将看到相同的行为。但是,现在我们可以在同一集合中多次执行订单。
John Doe (00000000-0000-0000-0000-000000000000)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Unspecified)
CreditRating: Good
AverageRating: 42.42424242
Orders:
Order Id: 00000000-0000-0000-0000-000000000000
Order Id: 00000000-0000-0000-0000-000000000000
Reloaded:
John Doe (fbde48f5-d620-4d1c-9a7f-a5b8017c3280)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Utc)
CreditRating: Good
AverageRating: 42.4242
Orders:
Order Id: 6dd7dbdb-354f-4c82-9c39-a5b8017c3286
Order Id: 9b3e2441-a81b-404d-9aed-a5b8017c3287
The orders were ordered by:
John Doe (fbde48f5-d620-4d1c-9a7f-a5b8017c3280)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Utc)
CreditRating: Good
AverageRating: 42.4242
Orders:
Order Id: 6dd7dbdb-354f-4c82-9c39-a5b8017c3286
Order Id: 9b3e2441-a81b-404d-9aed-a5b8017c3287
John Doe (fbde48f5-d620-4d1c-9a7f-a5b8017c3280)
Points: 100
HasGoldStatus: True
MemberSince: 1/1/2012 12:00:00 AM (Utc)
CreditRating: Good
AverageRating: 42.4242
Orders:
Order Id: 6dd7dbdb-354f-4c82-9c39-a5b8017c3286
Order Id: 9b3e2441-a81b-404d-9aed-a5b8017c3287
Press to exit...