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