Ленивая Загрузка требуется для nHibernate?

Нельзя использовать элементный инициализатор по умолчанию для назначения свойства struct с модификатором уровня доступа private.

Ваш второй пример работает, потому что вы задали значение свойства по умолчанию, поэтому вам не нужно присваивать его во время инициализации.

Если вам нужно присвоить свою частную собственность с помощью инициализатора, вы должны написать свою собственную

init(name: String, location: String, currentPatient: String) {
    self.name = name
    self.location = location
    self.currentPatient = currentPatient
}
6
задан Sophie Alpert 20 April 2009 в 17:42
поделиться

2 ответа

Я не понимаю, что вы имеете в виду, говоря "Я делал ленивую загрузку". Ленивая загрузка - это функция, она включена по умолчанию, и вы можете отключить ее, если она вам не нравится.

Существует два типа отложенной загрузки: для ссылок на другие объекты и для списков.

эта сущность:

class Entity
{
  // pk
  int id { get; private set; }

  // reference to another entity
  User MyUser { get; set; }

  // list to other entities
  IList<Comments> MyComments { get; set; }
}

Ленивая загрузка по ссылке на пользователя

Если у вас отложенная загрузка по пользователю, вам нужно определить всех членов класса User виртуальными. NHibernate создаст так называемый прокси. Прокси - это класс, определенный во время выполнения, который наследуется от пользователя. Ваш код обращается к нему как пользователь и не знает, что это подкласс. Но когда вы обращаетесь к одному из его членов в первый раз, свойства загружаются из базы данных.

Если вы хотите отключить отложенную загрузку для класса User, вам нужно сделать это в его отображении:

<class name="User" lazy="false"> ...

Затем NHibernate всегда создает экземпляры типа User, а не прокси. Вам не нужно иметь ничего виртуального.

Ленивая загрузка в списке комментариев

Если вы используете отложенную загрузку в списке комментариев, то это сам список, который реализует отложенную загрузку. Если вы обращаетесь к списку в первый раз, он загружается из базы данных. NHibernate использует список, который реализует IList, но не List.

Если вы хотите отключить отложенную загрузку в списке, вы делаете это в отображении Entity:

<class name="Entity">
    <bag name="MyComments" lazy="false" >
        ...

Обычно отложенная загрузка - это хорошо, и Ваше приложение не должно заботиться об этом много. Но есть некоторые риски. Например, если вы сериализуете экземпляр, и он является прокси, вы получаете неинициализированный прокси вместо чего-либо полезного. Ленивая загрузка работает только до тех пор, пока сессия открыта. Не всегда быстрее использовать ленивую загрузку. Если вам все равно нужно загрузить все данные, это быстрее, чтобы загрузить его в одной части.

Таким образом, конфигурация должна быть сделана тщательно.


Редактировать:

Чтобы ответить на ваш первоначальный вопрос: требуется ли ленивая загрузка для NHibernate? Нет. Но требуется ли ленивая загрузка в моем приложении? Скорее всего, да.

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

Требуется ли отложенная загрузка для NHibernate? Нет. Но требуется ли ленивая загрузка в моем приложении? Скорее всего, да.

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

Требуется ли отложенная загрузка для NHibernate? Нет. Но требуется ли ленивая загрузка в моем приложении? Скорее всего, да.

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

22
ответ дан 8 December 2019 в 03:28
поделиться

If you're using hbm.xml files for you mapping simply adding a lazy="false" to the element will get you non-lazy loading for all simple properties. Foreign entities will still be lazy by default. To make them eager add lazy="false" to the mapping element. One benefit of eager loading is you will no longer need virtual properties on your entity classes.

Edit: If you really want to find out what's going on behind the scenes, NHibernate logs everything using log4net. Adding

<configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  <!-- Rest of config sections here -->
</configSections>
<log4net>
  <appender name="SQLFileAppender" type="log4net.Appender.RollingFileAppender, log4net">
    <param name="File" value="C:\Logs\SQL.log" />
    <param name="AppendToFile" value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <logger name="NHibernate.SQL" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="SQLFileAppender" />
  </logger>
</log4net>

inside in your web.config will spit all the SQL NHibernate generates the file c:\logs\sql.log

7
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

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