2012-03-14 2 views
1

Fluent NHibernate와 automapping 기능을 함께 사용하는 Im. 이제 구성, 설정, 사용자 지정 특성과 같은 것을 찾으십시오 - 무엇이든 - "ReadOnlyFromDb"로 엔티티 속성을 선언하는 데읽기 전용 db-field (Fluent NHibernate Automapping)이어야하는 속성

MsSql 데이터베이스에서 값이 계산되는 테이블 중 하나에서 계산 된 열을 사용하는 im 특정 데이터 행의 일부 다른 값 이제 엔티티 클래스의이 열을

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 wiki를 검색했으나 똑똑한 사례를 발견하지 못했습니다.

누군가가 이미이 문제에 직면하고 해결했기를 바랍니다. 여기

내가 세션을 생성하는 방법을 코드입니다 (어쩌면 도움) :

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; 
    } 
} 

덕분에 지금까지의 응답 - 지금까지 저를 도왔다. -이 문제를 더 '동적으로'해결할 수있는 방법이 있습니까? 예를 들어

는 :

내가 지금 말을이 cusomt 속성을 가진 개체의 모든 속성을 선언 [ReadOnlyDbField]라는 사용자 지정 특성 선언 할

: 그냥이 값을 읽고 업데이트되지 않습니다를/삽입합니다.

기본적으로 나는이를 구현하는 방법이 있나요 구성

Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update() 

에하고 싶은 말?

답변

5
.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(); 
    } 
}