Только для чтения стратегий с Nhibernate и свободно Nhibernate - PullRequest
4 голосов
/ 14 сентября 2011

Я читал nhibernate для начинающих 3.0 и читал об общих ошибках (некоторые из них я делал)

Мне интересно, каковы некоторые стратегии для создания одной или нескольких записей только для чтения.Прямо сейчас я возвращаю все строки и перебираю их, делая их доступными только для чтения через сеанс. Readonly ().

Мне нравится в книге, что они делают с беглым

class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        SchemaAction.None();
        ReadOnly();

        // Mappings
    }
 }

Что яне уверен, что произойдет, если мне нужно, чтобы эти записи не были доступны только для чтения?Для меня это означает, что я должен сделать то же самое отображение без этих двух строк кода.

Так что я хотел бы сделать это и иметь ReadonlyEntityMap и EntityMap, но мне не нужно дублировать все настройки дважды.

У кого-нибудь есть идеи, как это сделать?Или лучшие идеи для чтения только?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

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

Если вы хотите применить какую-либо стратегию ReadOnly и Writeable, я бы предложил использовать Fluent Convention и интерфейс маркера или аналогичный.

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

Примерно так:

public interface IReadOnly{} //Mark entities with this interface

public class ReadOnlyConvention
     : IClassConvention, IClassConventionAcceptance<IClassInspector>
{
  public void Accept(IAcceptanceCriteria<IClassInspector> criteria)
  {
    criteria.Expect(x => x.EntityType Is IReadOnly);
  }

  public void Apply(IClassInstance instance)
  {
    instance.ReadOnly();
  }
}

Обновление: Если вы хотите выполнить преобразование времени, я бы предложил создать IUserType для вашего объекта DateTime, который выполняет преобразование во время пользователя без изменения базовых данных.

1 голос
/ 15 сентября 2011

Это зависит от того, чего вы пытаетесь достичь.Если вы пытаетесь оптимизировать потребление памяти, вам следует подумать об улучшении стратегии управления сеансами или использовании других методов повышения производительности. Например, вы можете:

  • Очистить сеанс, которыйзагрузил ваши объекты, и он освободит всю память, выделенную кешем первого уровня.Объекты могут быть позже присоединены (объединены) к новому сеансу, если это необходимо.Таким образом, вам не нужно, чтобы объекты были доступны только для чтения.

  • Выселите некоторые объекты, когда они вам больше не нужны.Это сохранит другие объекты в кэше первого уровня.

  • Использовать IStatelessSession , который вообще не использует кэш 1-го уровня.

Опять же, ответ зависит от архитектуры вашего приложения.

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