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

pat*_*ech 10 c# asp.net data-binding exception-handling entity-framework-4.1

在这个例子在这里,斯科特显示做对的DbContext LINQ查询,并将结果直接绑定到一个GridView,以显示产品列表.他的例子是使用Code First的CTP4版本.

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

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

我看到DBQuery对象在IListSource.GetList()的实现中故意抛出此错误,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();
Run Code Online (Sandbox Code Playgroud)

div*_*ega 14

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

从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和ToBindingList方法,它将集合包装在BindingList中,以便在WinForms中更容易使用.

我可以看到异常消息可以更明确地说明本地属性的存在.我会考虑为此提交一个错误.

希望这可以帮助

  • 仅仅是一个FYI,关于Local属性的完整异常消息是明确的:"不支持直接与商店查询(DbSet,DbQuery,DbSqlQuery,DbRawSqlQuery)绑定数据.而是使用数据填充DbSet,例如通过调用Load on the DbSet,然后绑定到本地数据.对于WPF绑定到DbSet.Local.对于WinForms绑定到DbSet.Local.ToBindingList()." (2认同)

AFD*_*AFD 10

遇到同样的问题,发现了这个话题.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();
}
Run Code Online (Sandbox Code Playgroud)

  • 正如你在问题中看到的那样,我说"我知道我可以通过放入products.ToList()"来完成这项工作. (2认同)