2009-05-28 2 views
3

nhibernate 쿼리의 결과에 바인딩 된 gridview 있습니다. 목록의 첫 번째 항목을 편집하는 경우 다음과 같은 예외가 발생합니다 :데이터 바인딩 문제를 일으키는 NHibernate 프록시

문제가 데이터 바인딩이 하위 유형 인 목록의 첫 번째 항목 다룰 수 없다는 사실에 의한 것 같습니다

System.Reflection.TargetException: Object does not match target type

목록에있는 다른 항목들.

이 문제를 해결하기위한 좋은 방법은 무엇입니까? 현재 nhibernates 프록시를 해제해야했습니다.

편집 : 나는 솔루션의 또 다른 커플이 : 목록 (http://steve-fair-dev.blogspot.com/2007/08/databind-object-does-not-match-target.html)에서

  • 복제 모든 - 객체
  • 변화 ICloneable를 구현하지 않는 한이 나를 위해 작동하지 않습니다 목록의 항목 순서가 프록시가 처음이 아니기 때문에 (http://community.devexpress.com/forums/t/30797.aspx) - 이것은 매우 해킹 된 것입니다.

그러나이 중 어느 것도 잘하지만 느낌이 없습니다 ...

답변

2

목록에있는 프록시 객체 (지연로드) 또는 그 목록이 동일하지 않기 때문에 근본 원인이 있습니까 (동일한 클래스 계층 구조에 속해 있어도 여러 유형 포함)? 비 균질 데이터 세트의 문제점은 알려진 제한 사항입니다. thisthis을 참조하십시오.

그리드를 채우는 데 데이터 바인딩을 사용하지 않는 것이 해결책이라고 생각하지 않습니다. 읽기 전용이라면 충분히 쉽습니다.

0

는 내가보기에 직접 내 도메인 개체를 사용하지 마십시오. 대신 MVVM 패턴을 사용하고 프록시되지 않은 객체를 보유하는 적합한 뷰 모델을 만듭니다.

3

아마도 너무 늦었지 만, 이것을 링에 넣고 싶습니다. 여기에 제가 사용했던 해결책이 있습니다.

위의 다른 제안과 마찬가지로 'SafeBindingList'라고도하지만 문제를 해결하기 위해 개체를 '복제'하지 않습니다. 목록에있는 객체를 확인한 다음 프록시가없는 경우 목록은 수정되지 않은 상태로 반환됩니다. 하나 이상의 객체가 프록시되면 비 프록시 객체에 빈 프록시를 추가하여 모두 동일한 유형으로 만듭니다.

그래서 List [T]를 바인드하도록 반환하려면 SafeBindingList [T]를 사용하여 모든 객체가 동일한 유형인지 확인하십시오. 관계의 경우 가져 오기 또 다른 솔루션입니다 https://forum.hibernate.org/viewtopic.php?t=959464&start=0&postdays=0&postorder=asc&highlight=

0

가입하기 : 또한 http://code.google.com/p/systembusinessobjects/source/browse/trunk/System.BusinessObjects.Framework/Data/SafeBindingLists.cs

, 신용은 원래의 코드와 포스터로 이동 :

이 성 버전에 대한 업데이트됩니다 NH2.0.1 사용 당신은 당신이 그것을 데이터 바인딩하는 것으로 알고 있습니다. 예 : .SetFetchMode ("People", FetchMode.Join)를 추가하십시오. Hibernate는 아무 것도 게으르지 않아야하므로 도메인 객체 만 반환해야한다.

0

매우 늦지 만 동일한 문제로 다른 사람들을 도울 것입니다. 내가 사용한 솔루션은 getter의 필드 주위에 사용자 지정 목록 (이 경우에는 NotificationList)을 래핑하는 것입니다.

private IList<IParameter> _parameters = new List<IParameter>(); 
get 
{ 
    return new NotificationList<IParameter>(_parameters); 
} 

이 목록은 데이터 바인딩이 원래 목록으로 전달되도록 목록 주위의 래퍼입니다.

public class NotificationList<T> : IList, IList<T>  
{ 
    IList<T> myList; 
    public NotificationList(IList<T> list) 
    { 
     myList = list; 
    } 
    int IList.Add(object item) 
    { 
     myList.Add ((T) item); 
    } 
    // implement both IList<T> and IList 
    // ... 
} 

은 나를 위해이 데이터 바인딩과의 문제를 해결하지만,이 변경되거나 말든 세션이 컬렉션의 모든 항목을 플러시 할 때마다이 DB에 업데이트됩니다 부작용을 만들었습니다. 이를 해결하기 위해 필드에 직접 액세스하도록 매핑을 변경했습니다. Hibernate의 this을 보라. Hibernate에도 적용된다.
이것은 (Fluent) 새로운 매핑입니다.

HasMany(x => x.Parameters) 
     .Cascade.All() 
     .Access.CamelCaseField(Prefix.Underscore); 
관련 문제