문제

나를 구하려고 매핑된 엔터티를 사용하여 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.BooleanTypetypes 배?

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 는 것을 고려하여 작성 데이터베이스 트리거입니다.기 때문에 요격은 당신이"오염시키는"귀하의 데이터 액세스를 계층입니다.그 그것이 불안정하고 당신 이상한 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top