NHibernate 추가 매핑되지 않은 열 interceptor
-
05-07-2019 - |
문제
나를 구하려고 매핑된 엔터티를 사용하여 NHibernate 그러나 나의 삽입하는 데이터베이스에 오류가 발생하기 때문에 기본 테이블의 열이 있는 null 을 허용하지 않고 매핑되지 않은 도메인에서 객체입니다.이 매핑되지 않기 때문에 열에서 질문을 지원하는 기존 응용 프로그램과 관련이 없으며 내 응용 프로그램-하고 싶을 오염시키지 않는 내 엔터티 레거시 제공합니다.
나는 사용할 수 있는 프라이빗 필드 내 클래스-그러나 이것은 여전히 불쾌한 느낌을 나입니다.나 읽기 내가 사용할 수 있습 NHibernate interceptor 과 재정의 OnSave()메소드를 추가하는 새로운 열기 전에 바로 나의 엔티티가 저장됩니다.이를 증명하기 어렵기 때문에 나는 작동할 수 없을 추가하는 방법은 인스턴스의 Nhibernate.유형입니다.IType 유형 매개 변수의 내 interceptor 의 OnSave.
내 기업은 대충 다음과 같습니다:
public class Client
{
public virtual int Id { get; set; }
public virtual int ParentId { get; set; }
public virtual string Name { get; set; }
public virtual string Phone { get; set; }
public virtual string Email { get; set; }
public virtual string Url { get; set; }
}
내 interceptor
public class ClientInterceptor : EmptyInterceptor
{
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
if (entity is Client)
{
/*
manually add the COM_HOLD column to the Client entity
*/
List<string> pn_list = propertyNames.ToList();
pn_list.Add("COM_HOLD");
propertyNames = pn_list.ToArray();
List<Object> _state = state.ToList();
_state.Add(false);
state = _state.ToArray();
//somehow add an IType to types param ??
}
return base.OnSave(entity, id, state, propertyNames, types);
}
}
누군가에 대한 아이디어가 어떻게 이렇게 하려면 제대로?
해결책
나는 확실히 말할 수 없습 때문에 나는 결코 실제로 이러(같은 스테판,나는 또한 선호를 추가 개인 재산),그러나 당신은 단지 추가 NHibernate.Type.BooleanType
을 types
배?
List<IType> typeList = types.ToList();
typeList.Add(new BooleanType());
types = typesList.ToArray();
편집
네,그것은 다음과 같은 권;유형가 internal
생성자입니다.나는 몇 가지고 파고 TypeFactory
:
응용 프로그램 사용해야 하는 정적 방법과 상수에 NHibernate.NHibernateUtil 는 경우 기본 IType 은 좋은 충분합니다.예를 들어,TypeFactory 만 는 경우 사용할 문자열이 필요하의 길이가 300 대신 255.이 시점에서 NHibernate.문자열을 얻지 않는다 당신이 올바른 IType.대신 사용하 TypeFactory.GetString(300)을 유지 지역 변수에 대한 참조를 보유 IType.
그래서 당신이 원하는 것은 NHibernateUtil
:
대한 액세스를 제공합의 전체 범위에 NHibernate 내장된 형식입니다.IType 인스턴스가 있을 수 있습니다 바인딩하는 데 사용되는 값 을 쿼리를 매개 변수입니다.또한 공장 에 대한 새로운 Blob 및 Clobs.
typeList.Add(NHibernateUtil.Boolean);
다른 팁
개인적으로 난 그렇게 복잡합니다.추가 개인 속성 및 할당하는 기본값이 있습니다.당신은 또한 고려에 기본값이 데이터베이스에서,당신은 필요가 없어요.
private virtual bool COM_HOLD
{
get { return false; }
set { /* make NH happy */ }
}
를 작성하기 전에 interceptor 는 것을 고려하여 작성 데이터베이스 트리거입니다.기 때문에 요격은 당신이"오염시키는"귀하의 데이터 액세스를 계층입니다.그 수 그것이 불안정하고 당신 수 이상한 문제입니다.