Отображение свойства только для чтения без установщика с использованием Fluent NHibernate - PullRequest
5 голосов
/ 06 ноября 2010

У меня есть класс домена, который выглядит следующим образом.Я хочу, чтобы NHibernate сохранил текущее значение LastUpdate при вставке / обновлении, чтобы я мог использовать его в запросах, но игнорировать его при извлечении Foo из базы данных и позволить самому объекту пересчитатьзначение, когда я на самом деле получаю к нему доступ.

public class Foo {
    public DateTime LastUpdate {
        get {
            /* Complex logic to determine last update by inspecting History */
            return value;
        }
    }
    public IEnumerable<History> History { get; set; }
    /* etc. */
}

Мое отображение для Foo выглядит следующим образом:

public class FooMap : ClassMap<Foo> {
    Map(x => x.LastUpdate)
        .ReadOnly();
    HasMany(x => x.History);
    // etc...
}

Я думал, что ReadOnly() - это то, чего я хотел достичь,но когда я пытаюсь создать SessionFactory, я получаю следующее исключение:

Ошибка: FluentNHibernate.Cfg.FluentConfigurationException: недопустимая или неполная конфигурация использовалась при создании SessionFactory.Проверьте коллекцию PotentialReasons и InnerException для более подробной информации.
---> NHibernate.PropertyNotFoundException: Не удалось найти установщик для свойства 'LastUpdate' в классе 'Foo'.

Свойство не делаетУ него нет сеттера, потому что он не должен быть установлен, только чтение из .ReadOnly() правильно ли здесь делать?Если нет, то что?

(NHibernate v3.0b1, Fluent NHibernate v1.1)

Ответы [ 3 ]

13 голосов
/ 08 ноября 2010

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

Map(x => x.LastUpdate)
  .Access.Field();

Существует несколько альтернатив использованию Field, выбор которого будет зависеть от того, как вы называете свои личные поля.

2 голосов
/ 06 ноября 2010

Что касается NHibernate, вы можете отобразить поле, то есть переменную-член, чтобы Nhibernate мог получить доступ к переменной-члену напрямую. Таким образом, вы можете создать переменную-член, такую ​​как _lastUpdate, которая может быть отображена напрямую. Nhibernate теперь будет иметь переменную для использования, и вы можете управлять значением отдельно в своем геттере, потому что NHibernate больше не будет использовать геттер свойства. Он сохранит значение и получит его тоже, но полученное значение не должно иметь значения, потому что, как только вы получите доступ через геттер, вы можете пересчитать его. То же самое относится и к частным переменным без методов получения или установки.

В обычном hbm вы бы просто отобразили access = field. Все это делают. Видимо, бегло не все просто. Я не использую Fluent ...

РЕДАКТИРОВАТЬ ...

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

0 голосов
/ 23 сентября 2015

Просто добавьте пустой приватный сеттер в ваш класс:

        private set { }

Я также добавляю атрибут и комментарий, чтобы документировать мои намерения (и радую ReSharper):

        [UsedImplicitly]
        // ReSharper disable once ValueParameterNotUsed
        private set { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...