Свободный nHibernate, автоинкрементный числовой, кроме ключа - PullRequest
1 голос
/ 01 февраля 2011

У меня есть ситуация, когда, скажем, Notebook хранит Pages.Сначала у меня была такая структура.

class Notebook
{
 // ...
 public virtual IList<Page> Pages
 {
  get;
  set;
 }
}

class Page
{
 // ..
 public virtual int Number
 {
  get;
  set;
 }
}

Это работало хорошо.У каждой страницы был номер страницы.У меня была бы возможность изменить порядок страниц в моем пользовательском интерфейсе и обновить номер.Нет проблем.Затем я обнаружил, что могу использовать словарь и упростить его еще больше ...

class Notebook
{
 // ...
 public virtual IDictionary<int, Page> Pages
 {
  get;
  set;
 }
}

class Page
{
 // ..
}

И нанести на карту это примерно так ...

public class NotebookMap : ClassMap<Notebook>
{
    public NotebookMap()
    {
        // Specify the Entity Primary Key
        Id(x => x.Id);

        // one notebook will have a list of pages with page numbers
        HasMany<int, Page>(x => x.Pages)
            .DictionaryKey<int>("Number")
            .DictionaryValue<Page>("Page")
            .ForeignKey("Notebook")
            .Schema("Notebook").Table("Pages"); 

        Schema(Schemas.Collections ); Table("Notebooks");
    }
}

Huzzah, с миром все было в порядке.Это прекрасно работает.Но мне любопытно ...

Есть ли способ привязать Number к чему-то, что обеспечит автоматическое увеличение на Notebook?Прямо сейчас я просто обрабатываю это в своем Service, используя метод Notebook.Pages.Count, когда добавляю новую страницу.Но беглый nHibernate кажется довольно умным.Можно ли каким-то образом интегрировать его прямо в отображение, чтобы в любое время, когда я добавлял новую страницу, он просто получал счетчик и проверял, что число соответствует?

1 Ответ

1 голос
/ 01 февраля 2011

Я думаю, вы действительно хотите не допустить этого в карту. Вы будете смешивать логику приложения (куда должна идти следующая страница) с моделью (как я храню следующую страницу). Также, если вы сделаете этот столбец автоинкрементным, вам придется делать это отдельно для каждой таблицы. Если вы не создаете новую таблицу для каждой книги, вы (AFAIK) могли бы иметь только 1 последовательно увеличивающийся ключ (поскольку собственный генератор, использующий столбцы автоматического увеличения в NHibernate, выполняется через базу данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...