错误“尝试跟踪实体或复杂类型失败,因为实体或复杂类型”

时间:2011-08-29 20:48:40

标签: wcf-data-services

我创建了一个ASP.NET Web应用程序(使用WCF数据服务)并添加了对http://services.odata.org/Northwind/Northwind.svc的服务引用。创建一个网页(.aspx)并添加一个GridView和Button控件。

写下以下代码:

protected void Button1_Click(object sender, EventArgs e)
{
    var o = new NorthwindSvcRef.NorthwindEntities(new Uri("http://services.odata.org/Northwind/Northwind.svc"));

    //The following works fine
    //------------------------
    //var q = o.Customers.Where(c => c.City == "London").ToList();
    //GridView1.DataSource = q;
    //GridView1.DataBind();


    //Following does not work
    //-----------------------
    var q = o.Customers
       .Where(c => c.City == "London")
       .Select(c => c);

    DataServiceCollection<Customer> oCustomers = new DataServiceCollection<Customer>(q);
    GridView1.DataSource = oCustomers;
    GridView1.DataBind();
}

执行上述代码后,我遇到以下错误:

  

尝试跟踪实体或复杂类型失败,因为   实体或复杂类型'NorthwindSvcRef.Customer'未实现   INotifyPropertyChanged接口。

有人可以帮我吗?

提前致谢

4 个答案:

答案 0 :(得分:3)

尝试使用重载DataServiceCollection<T> Constructor (IEnumerable<T>, TrackingMode)并使用TrackingMode.None枚举器。

e.g。

DataServiceCollection<MyTable> MyDataServiceCollection = new DataServiceCollection<MyTable>(qry, TrackingMode.None);

答案 1 :(得分:0)

指定

config.useverboseerrors = true

中的

service.cs

这会对你有帮助。

答案 2 :(得分:0)

我遇到了这个问题,但可能是因为我的实体只有读取权限,因此不需要通知任何更改。

DataServiceCollection提供更改通知,因此发生错误。

答案 3 :(得分:0)

在ASP.NET Web应用程序项目中使用visual studio生成服务引用时,生成的代理类中未实现INotifyPropertyChange接口,这就是您收到此错误的原因。最简单的解决方案是在其他项目类型中生成服务refence(例如WPF或Windows Forms - 将自动实现INotifyPropertyChanged),然后将“Reference.cs”文件复制到您的Web应用程序(您可能需要更改此文件中的命名空间)。您必须记住以后不要从Web应用程序项目生成服务引用,因为“Reference.cs”文件将被覆盖并且错误将返回。