Свойство, которое должно быть полем базы данных только для чтения (Fluent NHibernate Automapping)

StackOverflow https://stackoverflow.com//questions/9699126

  •  13-12-2019
  •  | 
  •  

Вопрос

Я использую 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

Это правильно, насколько я понимаю, и так и должно было быть ;)!

По сути, я ищу конфигурацию, настройку, настраиваемый атрибут — что угодно, чтобы сказать

Привет, Fluent 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] теперь объявите все свойства объекта с помощью этого пользовательского атрибута, чтобы сказать:Просто прочитайте это значение и не обновляйте/вставляйте его.

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

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

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

Это было полезно?

Решение

.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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top