Если данные находятся в структуре, которая представляет собой иерархию между записями, является циклом, то рекурсия становится бесконечной, вызывая проблему в SQL. Вы увидите, что ресурсы, используемые процессом SQL, значительно увеличиваются. Если вы используете MAXRECURSION с значением, отличным от 0 (ноль позволяет SQL продолжать рекурсию без ограничения), вы сможете ограничить рекурсию. С данными, которые зацикливаются или ссылаются друг на друга, вы можете использовать параметр MAXRECURSION
Шаблон, который я использую:
class Order
{
private List<OrderLine> lines = new List<OrderLine>();
IEnumerable<OrderLine> Lines { get { return this.lines; } }
void AddLine(OrderLine line)
{
this.orders.Add(line);
}
}
При использовании СЕТЕВЫХ 3.5, Вы получаете всю функциональность поиска, которую Вы могли бы хотеть для IEnumerable, использующего LINQ, и Вы скрываете свою реализацию набора.
Проблема с возвратом OrderLine [] состоит в том, что Ваш набор может быть изменен внешне, например:
Order.Lines[0] = new OrderLine().
Я делаю это как это:
public class Order
{
private ISet<OrderLine> _orderLines = new HashedSet<OrderLine>();
public ReadOnlyCollection<OrderLine> OrderLines
{
get { return new List<OrderLine>(_orderLines).AsReadOnly(); }
}
public void AddOrderLine( OrderLine ol )
{
...
}
}
Затем offcourse, в отображении, NHibernate говорят использовать _orderLines поле:
<set name="OrderLine" access="field.camelcase-underscore" ... >
...
</set>
Я выставляю наборы как ReadOnlyCollection и использую методы AddX и RemoveX для поддержания наборов. Мы просто переключились на 3,5, и я думаю о представлении IEnumerable вместо этого. В большинстве случаев с NHibernate у ребенка есть ссылка на родителя, настолько выставляющего, Добавляют и Удаляют методы, позволяет Вам поддерживать те отношения:
public void AddPlayer(Player player)
{
player.Company = this;
this._Players.Add(player);
}
public void RemovePlayer(Player player)
{
player.Company = null;
this._Players.Remove(player);
}
Если я выставляю список, который не должен быть изменен, то я использую IEnumerable и урожай. Я нахожу громоздкой попыткой использовать ReadOnlyCollections в сочетании с NHiberante.
С этим подходом у Вас все еще есть поле частных линий, которое отображается и заполнило через NHibernate; однако, открытый доступ к набору выполняется через итераторы. Вы не можете добавить к или удалить из базового списка с этим свойством Lines.
Например:
public IEnumerable<OrderLine> Lines {
get {
foreach (OrderLine aline in lines) {
yield return aline;
}
}
}