Свойство, которое должно быть доступно только для чтения в db-поле (Fluent NHibernate Automapping)

Я использую Fluent NHibernate вместе с функцией автокартинга. Теперь я ищу что-то вроде конфигурации, настроек, пользовательских атрибутов - что угодно - чтобы объявить свойство сущности как "ReadOnlyFromDb"

В базе данных MsSql я использую вычисляемый столбец в одной из моих таблиц, где значение вычисляется в зависимости от некоторых других значений конкретной строки данных. Теперь я объявил этот столбец в классе сущности как

public virtual int STATUS { get; private set; }

При получении конкретных данных таблицы все работает отлично. Недвижимость STATUS заполнен правильно с конкретным значением в таблице данных.

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

A computed column cannot be the target of an INSERT or UPDATE statement

Что правильно для моего понимания - и так, как это должно было быть;)!

В основном я ищу конфигурацию, настройку, пользовательский атрибут - что угодно - сказать

Эй, бегло NHibernate - получить конкретное свойство propertyName но не вставляйте / обновляйте свойство propertyName

Есть ли что-то подобное? Или есть обходной путь для этого случая? Я искал беглую вики nhibernate, но не нашел случай с улыбками.

Я надеюсь, что кто-то уже сталкивался и решил эту проблему!

Вот фрагмент кода, как я создаю сессию (возможно, это поможет):

    public static ISessionFactory GetNHibernateSession()
    {
        if (nhibernateSession != null)
            return nhibernateSession;

        if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty)
            throw new NullReferenceException(String.Format("AppSetting '{0}' must not be null!", msSqlConnectionString));

        //nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
        //                              .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<T_ABWEICHUNGEN>().IgnoreBase<BaseClass>)).BuildSessionFactory();

        nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
                                   .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(System.Reflection.Assembly.GetExecutingAssembly())
                                   .Override<T_ABWEICHUNGEN>(map =>map.Map(d => d.A08_STATUS_FILE).Length(2147483647))
                                   .IgnoreBase(typeof(BaseClass))
                                   .IgnoreBase(typeof(IDColumn))
                                   .IgnoreBase(typeof(MsSqlQuery))
                                   .IgnoreBase(typeof(MsSqlParamCollection))
                                   .IgnoreBase(typeof(AbweichungStatus))
                                   )).BuildSessionFactory();
        return nhibernateSession;
    }
}

пока спасибо за ответ - помог мне пока. Но есть ли способ решить эту проблему более "динамично"?

Например:

Я хочу объявить пользовательский атрибут с именем [ReadOnlyDbField] теперь объявите все свойства объекта с этим атрибутом cusomt, чтобы сказать: просто прочитайте это значение и не обновляйте / вставляйте его.

В основном я хочу сказать в конфигурации

Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update()

Есть ли способ реализовать это?

1 ответ

Решение
.Override<Entity>(map => map.Map(d => d.STATUS).Not.Insert().Not.Update())

обновление: учетная запись для отредактированного вопроса

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Другие вопросы по тегам