Свойство, которое должно быть доступно только для чтения в 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();
}
}