Свойство, которое должно быть доступно только для чтения в db-поле (Fluent NHibernate Automapping) - PullRequest
1 голос
/ 14 марта 2012

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

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

1 Ответ

5 голосов
/ 14 марта 2012
.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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...