簡體   English   中英

NHibernate代理導致數據綁定問題

[英]NHibernate proxy causing problems with databinding

我有一個gridview,它綁定到nhibernate查詢的結果。 如果編輯列表中的第一項,則拋出以下異常:

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

似乎問題是由於數據綁定無法處理列表中的第一項是列表中其他項的子類型這一事實。

解決這個問題的好方法是什么? 目前我不得不關閉nhibernates代理。

編輯:我有另外幾個解決方案:

但這些都不是正確的......

也許為時已晚,但我只是想把它扔進戒指,這是我用過的解決方案。

它也像上面的其他建議一樣被稱為'SafeBindingList',但它不會'克隆'對象來解決問題。 它查看列表中的對象,如果沒有代理,則返回未修改的列表。 如果代理了一個或多個對象,它會向非代理對象添加一個空代理,從而使它們具有相同的類型。

因此,返回一個List [T]來綁定,使用SafeBindingList [T]來確保所有對象具有相同的類型。

這是針對與NH2.0.1一起使用的Castle版本更新的: 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& posttdays = 0 & postorder = asc highlight =

是由於列表中的代理對象(來自延遲加載)還是因為列表不是同類的(即使它們屬於同一個類層次結構包含多個類型),也是根本原因? 非同類數據集的問題是已知的限制。 看到這個這個

我不認為除了不使用數據綁定來填充網格之外還有其他解決方案。 如果它是只讀的,這很容易。

另一個解決方案是如果您知道要將數據綁定它,則加入獲取關系。 例如,添加.SetFetchMode(“People”,FetchMode.Join)。 NHibernate應該只返回域對象,因為它們都不應該是延遲加載的。

很晚,但應該幫助其他人同樣的問題。 我使用的解決方案是在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
    // ...
}

對我來說,這解決了數據綁定的問題,但是創建了一個副作用,每次會話被刷新時,集合中的所有項目都會在數據庫中更新,無論是否更改。 為了解決這個問題,我更改了映射以直接訪問該字段。 在Hibernate上看到這個 ,它也適用於NHibernate。
這是新的(流利)映射:

HasMany(x => x.Parameters)
       .Cascade.All()
       .Access.CamelCaseField(Prefix.Underscore);

我不直接在視圖中使用我的域對象。 相反,我使用MVVM模式並創建包含非代理對象的合適視圖模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM