我创建了一个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接口。
有人可以帮我吗?
提前致谢
答案 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”文件将被覆盖并且错误将返回。