Webforms数据绑定使用EF Code-First Linq查询错误

本文关键字:Linq 查询 错误 Code-First EF 数据绑定 Webforms | 更新日期: 2023-09-27 18:01:50

在本例中,Scott展示了对dbContext执行Linq查询并将结果直接绑定到GridView以显示产品列表。他的例子是使用CTP4版本的Code First的东西。

然而,当我尝试使用最新版本的EntityFramework 4.1做同样的事情时,我得到以下错误:

直接绑定到存储查询(DbSet, DbQuery, DbSqlQuery)的数据是不受支持的。而是用数据填充DbSet,例如通过在DbSet上调用Load,然后绑定到本地数据。

我看到DBQuery对象在实现IListSource.GetList()时故意抛出这个错误,这是在数据绑定中使用的。

你知道为什么他的例子有效吗?顺便说一下,我知道我可以通过加入一个projects.ToList()来实现这个。我的主要问题是,是否在发布版本中发生了一些变化,使得这种类型的东西不再工作,或者我是否在某个地方错过了可以解决此错误的东西。

作为参考,我指的是这样的代码:

MyDbContext db = new MyDbContext();
var projects = from p in db.Projects
               where p.AnotherField == 2
               select p;
grdTest.DataSource = projects;
grdTest.DataBind();

Webforms数据绑定使用EF Code-First Linq查询错误

这是一个很长的故事,但我会尽量不让它无聊。

从EF的第一个版本开始,我们支持直接绑定到查询。我们对由此产生的陷阱和混乱有了足够的经验,因此我们决定在为EF 4.1创建的新API中显式禁用它。对我来说,主要的问题是WinForms和WPF数据绑定基础设施假设数据源在内存中,并且访问成本低廉。这导致数据绑定经常不止一次地请求绑定列表。在EF上,绑定到可重用查询必然意味着需要从数据库获取最新的结果,因此我们这样做,以便每次请求绑定列表时,我们都对数据库重新执行查询。这将导致每次有人绑定到查询时至少执行两次查询。

对许多客户来说,绑定查询还有其他一些方面非常令人困惑或违反直觉。我在这篇博文中探讨了过去的工作方式:http://blogs.msdn.com/b/diego/archive/2008/10/09/quick-tips-for-entity-framework-databinding.aspx

DbContext API应该做的是直接绑定到本地数据,而不是查询。为此,我们公开DbSet。Local,它是一个ObservableCollection,在WPF中工作得很好,而toindinglist方法将集合包装在一个BindingList中,以便在WinForms中更容易使用。

我可以看到异常消息可以更明确地说明local属性的存在。我会考虑提交一个bug。

希望能有所帮助

遇到同样的问题,发现了这个主题。ToList()工作:

using (NorthwindContext context = new NorthwindContext())
{
    var products = from p in context.Products
                   where p.Discontinued == false
                   select p;
    gridView.DataSource = products.ToList();
    gridView.DataBind();
}

在Reflector中查看EF4 Feature CTP4发布dll,我可以看到它的DBQuery对象没有实现IListSource.GetList(),并像EF 4.1 dll那样抛出异常。我猜他们有理由不再允许直接绑定到查询,即使它实现了IEnumerable。

这并没有回答他们为什么要做这个改变,但至少我可以看到它在旧版本中工作的原因。