2009-05-28 14 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

リストにプロキシオブジェクトがある(遅延読み込みによる)か、リストが同質でない(同じクラス階層に属していても複数のタイプが含まれている)ために根本的な原因はありますか?非同種データセットの問題は、既知の制限です。 thisおよびthisを参照してください。

私は、データバインディングを使用してグリッドを作成する以外の解決策はないとは思いません。読み取り専用の場合は簡単です。

0

...しかし、右感じていません。代わりに、私はMVVMパターンを使用し、非プロキシオブジェクトを保持する適切なビューモデルを作成します。

3

多分遅すぎるかもしれませんが、私はこれをリングに投げたいと思いますが、これは私がこれに使用した解決策です。

これは上記の他の提案と同様に 'SafeBindingList'とも呼ばれますが、問題を解決するためにオブジェクトを '複製'しません。リスト内のオブジェクトを調べ、プロキシがない場合はリストをそのまま返します。 1つ以上のオブジェクトがプロキシされている場合は、プロキシされていないオブジェクトに空のプロキシが追加され、すべて同じタイプになります。

リスト[T]をバインドする代わりにSafeBindingList [T]を使用して、すべてのオブジェクトの型が同じであることを確認します。

これは城のバージョンに更新されてはNH2.0.1で使用: http://code.google.com/p/systembusinessobjects/source/browse/trunk/System.BusinessObjects.Framework/Data/SafeBindingLists.cs

をまた、クレジットが元のコードとポスターに行く: https://forum.hibernate.org/viewtopic.php?t=959464&start=0&postdays=0&postorder=asc&highlight=

0

別の解決策は、以下の場合に関係のフェッチに参加することですあなたはそれをデータバインディングするつもりであることをあなたは知っています。例えば。 .SetFetchMode( "People"、FetchMode.Join)を追加します。 NHibernateは、それらのどれもが遅延ロードされるべきでないので、ドメインオブジェクトだけを返すべきです。

0

非常に遅いですが、同じ問題を持つ他の人に役立つはずです。 私が使用した解決策は、ゲッターのフィールドの周りにカスタムリスト(この場合は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を参照してください。これはNHibernateにも適用されます。
これは新しい(Fluent)マッピングです:

HasMany(x => x.Parameters) 
     .Cascade.All() 
     .Access.CamelCaseField(Prefix.Underscore); 
関連する問題