2011-07-27 1 views
0

다음과 같은 모델이 있습니다.가상 클래스가 아닌 속성 및 메서드를 사용하여 시스템 클래스에서 파생 된 엔터티 클래스를 작성하고 매핑하는 방법은 무엇입니까?

public class DataValue : Collection<DataValue> 
{ 
    private List<DataValue> _values; 
    public virtual int Id { get; set; } 
    public virtual string Value { get; set; } 

    protected override void InsertItem(int index, DataValue item) 
    { 
    base.InsertItem(index, item); 
    this._values.Add(item._value); 
    } 
} 

모델은 Collection 클래스를 상속합니다. 이것은 내 도메인 모델에서 필요하지만 NHibernate에서는 중요하지 않습니다. 따라서이 클래스의 모든 인스턴스는 데이터베이스의 한 행이지만 소프트웨어의 다른 부분에 의해 초기화되는 다른 DataValue를 포함 할 수 있습니다. NHibernate에 프록시 클래스를 생성 할 때 나는 오류를

NHibernate.InvalidProxyTypeException: NHibernate.InvalidProxyTypeException: 
The following types may not be used as proxies: 
DataValue: method get_Count should be 'public/protected virtual' or 'protected internal virtual' 
DataValue: method get_Item should be 'public/protected virtual' or 'protected internal virtual' 
DataValue: method set_Item should be 'public/protected virtual' or 'protected internal virtual' 
DataValue: method Add should be 'public/protected virtual' or 'protected internal virtual' 
etc... basically all the Collection methods and properties 

물론 이것은 사실로 인해 발생하는 수집 방법과 다음 던졌습니다, 지금이 (유창함) 같은

public DataValueMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.Value); 
} 

를 매핑 속성은 가상이 아닙니다. 이 문제를 어떻게 해결해야합니까?

  • DataValue는 지연로드가 가능해야 LazyLoad를 비활성화 할 수 없습니다.
  • IList를 구현할 수 있고 Collection을 상속하지 않지만 클래스를 복잡하게 만들고 Collection을 상속하는 것이 제 의견입니다.

답변

0

언제 프록시를 처리 할 수 ​​있는지 확실하지 않다 모든 공개 속성 및 메서드를 가상으로 표시하려면 이는 매핑 된 클래스의 프록시를 반환하기 위해 nhibernate가 객체의 프록시 객체를 상속하고 지연로드 마법을 추가하기 때문입니다. 따라서 매핑 된 클래스의 각 공용 속성은 지연로드되어야하며 가상이어야합니다. Collection에서 직접 상속 한 속성을 제어 할 수 없으므로 (이 작업을 수행하는 주변 코드의 이유가 확실하지 않음) 해당 요구 사항을 생략하기 위해 코드를 다시 배열하거나 ICollection에서 상속을 시도 할 필요가 있습니다 Collection (아마도 가장 좋은 방법)에서 직접 상속하는 대신 직접 메서드를 구현하는 것입니다.

+0

나는이 대답에서 설명한 David처럼 구현을 마쳤습니다. Firo의 접근법은 어떤 경우에는 가능할 수도 있습니다. IList를 구현하고 Collection 유형의 개인 속성을가집니다. –

0

체크는 해제 할 수 있습니다 :

public class CustomProxyFactoryFactory : IProxyFactoryFactory 
{ 
    NHibernate.ByteCode.Castle.ProxyFactoryFactory internalfactory = ...; 

    public IProxyFactory BuildProxyFactory() 
    { 
     return internalfactory.BuildProxyFactory(); 
    } 

    public bool IsInstrumented(Type entityClass) 
    { 
     return true; 
    } 

    public bool IsProxy(object entity) 
    { 
     return (entity is INHibernateProxy); 
    }  

    public IProxyValidator ProxyValidator 
    { 
     get { return new CustomProxyValidator(); } 
    } 
} 

public class CustomProxyValidator : DynProxyTypeValidator 
{ 
    private const bool iDontCare = true; 

    protected override bool CheckMethodIsVirtual(Type type) 
    { 
     return iDontCare; 
    } 
} 

이 fluentnhibernate

Fluently.Configure() 
    .Database(xxxConfiguration.Standard 
     .ProxyFactoryFactory<CustomProxyFactoryFactory>()) 

를 사용하여 내가 성 당신이 관여하는 비 가상 메소드

관련 문제