C# NHibernate代理导致数据绑定问题

C# NHibernate代理导致数据绑定问题,c#,asp.net,nhibernate,proxy,data-binding,C#,Asp.net,Nhibernate,Proxy,Data Binding,我有一个绑定到nhibernate查询结果的gridview。如果编辑列表中的第一项,将引发以下异常: System.Reflection.TargetException:对象与目标类型不匹配 这个问题似乎是由于数据绑定无法处理列表中的第一项是列表中其他项的子类型这一事实造成的 解决这个问题的好方法/正确方法是什么?目前我不得不关闭nhibernates代理 编辑:我还有两个解决方案: 克隆列表中的所有内容()-这不适用于我,因为该对象未实现ICloneable 更改列表中项目的顺序,使代理不

我有一个绑定到nhibernate查询结果的gridview。如果编辑列表中的第一项,将引发以下异常:

System.Reflection.TargetException:对象与目标类型不匹配

这个问题似乎是由于数据绑定无法处理列表中的第一项是列表中其他项的子类型这一事实造成的

解决这个问题的好方法/正确方法是什么?目前我不得不关闭nhibernates代理

编辑:我还有两个解决方案:

  • 克隆列表中的所有内容()-这不适用于我,因为该对象未实现ICloneable
  • 更改列表中项目的顺序,使代理不在第一位()-这太令人讨厌了,我想我不能降低到这么低

但是这些都不正确…

我不直接在视图中使用我的域对象。相反,我使用MVVM模式并创建适当的视图模型来保存非代理对象。

根本原因是列表中的代理对象(来自延迟加载)还是因为列表不是同质的(包含多个类型,即使它们属于同一类层次结构)?非齐次数据集的问题是一个已知的限制。见和


我认为除了不使用数据绑定来填充网格之外,没有其他解决方案。如果它是只读的,那就很容易了。

可能太晚了,但我想把它放到拳击场上,这里有一个解决方案,我已经用过了

它也被称为“SafeBindingList”,就像上面的另一个建议一样,但它不会“克隆”对象来解决问题。它查看列表中的对象,如果没有代理,则返回未修改的列表。如果代理了一个或多个对象,则会向未代理的对象添加一个空代理,从而使它们都具有相同的类型

因此,使用SafeBindingList[T]来确保所有对象具有相同的类型,而不是返回要绑定到的列表[T]

此更新适用于与NH2.0.1一起使用的Castle版本:

此外,原始代码和海报也值得称赞:

另一种解决方案是,如果您知道将要对关系进行数据绑定,则加入并获取该关系。例如,add.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
    // ...
}
HasMany(x => x.Parameters)
       .Cascade.All()
       .Access.CamelCaseField(Prefix.Underscore);