문제

나는 자동 매핑 기능과 함께 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