읽기 전용 db 필드여야 하는 속성(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();
}
}