Что является лучшей практикой для списков только для чтения в NHibernate

Если данные находятся в структуре, которая представляет собой иерархию между записями, является циклом, то рекурсия становится бесконечной, вызывая проблему в SQL. Вы увидите, что ресурсы, используемые процессом SQL, значительно увеличиваются. Если вы используете MAXRECURSION с значением, отличным от 0 (ноль позволяет SQL продолжать рекурсию без ограничения), вы сможете ограничить рекурсию. С данными, которые зацикливаются или ссылаются друг на друга, вы можете использовать параметр MAXRECURSION

10
задан Mike Chaliy 14 March 2009 в 22:33
поделиться

4 ответа

Шаблон, который я использую:

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().
9
ответ дан 3 December 2019 в 15:53
поделиться

Я делаю это как это:

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>
14
ответ дан 3 December 2019 в 15:53
поделиться

Я выставляю наборы как 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);
    }
3
ответ дан 3 December 2019 в 15:53
поделиться

Если я выставляю список, который не должен быть изменен, то я использую IEnumerable и урожай. Я нахожу громоздкой попыткой использовать ReadOnlyCollections в сочетании с NHiberante.

С этим подходом у Вас все еще есть поле частных линий, которое отображается и заполнило через NHibernate; однако, открытый доступ к набору выполняется через итераторы. Вы не можете добавить к или удалить из базового списка с этим свойством Lines.

Например:

public IEnumerable<OrderLine> Lines {
    get {
        foreach (OrderLine aline in lines) {
            yield return aline;
        }
    }
}
1
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: