Я использую 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
Что правильно для моего понимания - и как оно должно было быть;)!
По сути, я ищу конфигурацию, настройку, пользовательский атрибут - что угодно - скажем,
Hey 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]
, теперь объявляем все свойства объекта с этим атрибутом cusomt, чтобы сказать: просто прочитайте это значение и не обновляйте / вставляйте его.
В основном я хочу сказать в конфигурации
Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update()
Есть ли способ реализовать это?