NHibernate POCO / Основы - PullRequest
       17

NHibernate POCO / Основы

5 голосов
/ 19 ноября 2009

Раньше я использовал L2S и смотрю на использование NHib вместе с Sharp Architecture для проекта. Я начал создавать прототипы и столкнулся с первой проблемой, о которой я не знаю, как искать в Google.

Учитывая POCO с некоторыми простыми свойствами и одним ссылочным свойством (Category - класс, не показанный здесь):

public class Post
{
  public Post()
  {
    this.DateCreated = DateTime.Now;
  }

  public virtual string Title {get;set;}
  public virtual DateCreated {get;set;}
  public virtual Category {get;set;}
}

Это удобно, если я хочу создать сводку сообщений в табличном формате - если мне нужен столбец с именем «Категория» и я хочу показать название категории, я могу просто использовать Post.Category.Title.

Однако пользователь создает новый пост (он выбирает категорию из выпадающего списка или аналогичную). Они нажимают кнопку «Отправить», и я создаю объект Post. Однако прежде чем я смогу сохранить новое сообщение, мне нужно получить экземпляр категории (по идентификатору), чтобы присвоить свойству категории?

Как получить лучшее из обоих миров? Если я обновлю Post POCO, сделав Category int, я упросту создание новых экземпляров. Но сложнее для некоторого кода рендеринга, который теперь должен будет разрешить имя категории с помощью идентификатора?

Я чувствую, что мне здесь не хватает какой-то базовой концепции?

Я знаю, что с помощью Linq to Sql была дана схема, в которой таблица Post содержала целочисленный ключевой столбец с именем CategoryId, который генерировал бы меня как базовый столбец таблицы (CategoryId), так и EntitySet, который содержал строку внешнего ключа.

Как добиться подобного в NHibernate? Как это вообще управляется?

Спасибо

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

Связанные объекты должны отображаться как объекты - например, Category, а не int CategoryId.

Когда вы создаете новый Post, если у вас нет фактического Category экземпляра (и почему нет? Если вы выбираете категории из списка, который вы уже загрузили), но имеете только его идентификатор, вы можете использовать метод Load () , чтобы получить постоянный экземпляр категории для данного идентификатора без фактического попадания в базу данных:

post.Category = (Category) sesssion.Load(typeof(Category), categoryId);

Вы также можете использовать универсальную версию:

post.Category = session.Load<Category>(categoryId);
1 голос
/ 19 ноября 2009

В NHibernate вы используете ссылочное свойство.

При использовании беглого отображения это выглядит примерно так:

mapping.References(x => x.Category, "CategoryId").PropertyRef(x=>x.Id).Cascade.All();

в XML, это примерно

<many-to-one name="Category" column="category_id" class="YourNamespace.Category" cascade="all" property-ref="Id" />

Вы можете использовать not-found, чтобы выбрать поведение, когда нет связанной категории.

По сути, вам нужна семантика объекта категории, а не ID, поэтому вы просто сообщите NHibernate, как они связаны.

...